Spinner представляет собой выпадающий список. Определим в файле разметки activity_main.xml элемент Spinner:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp">
<Spinner
android:id="@+id/spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
В качестве источника данных, как и для ListView, для Spinner может служить простой список или массив, соданный программно, либо ресурс
string-array. Взаимодействие с источником данных также будет идти через адаптер. В данном случае определим источник программно в виде массива в коде MainActivity:
package com.example.listapp;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
public class MainActivity extends AppCompatActivity {
String[] countries = { "Бразилия", "Аргентина", "Колумбия", "Чили", "Уругвай"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Spinner spinner = findViewById(R.id.spinner);
// Создаем адаптер ArrayAdapter с помощью массива строк и стандартной разметки элемета spinner
ArrayAdapter<String> adapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, countries);
// Определяем разметку для использования при выборе элемента
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// Применяем адаптер к элементу spinner
spinner.setAdapter(adapter);
}
}
Используемый при создании ArrayAdapter ресурс android.R.layout.simple_spinner_item предоставляется платформой и является стандартной разметкой для создания выпадающего списка.
С помощью метода adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) устанавливаются дополнительные визуальные возможности списка.
А передаваемый в метод ресурс android.R.layout.simple_spinner_dropdown_item используется для визуализации выпадающего списка и также предоставляется платформой.
Используя слушатель OnItemSelectedListener, в частности его метод onItemSelected(), мы можем обрабатывать
выбор элемента из списка. Вначале добавим в разметку интерфейса текстовое поле, которое будет выводить выбранный элемент:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp">
<TextView
android:id="@+id/selection"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="26sp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent">
</TextView>
<Spinner
android:id="@+id/spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@+id/selection" />
</androidx.constraintlayout.widget.ConstraintLayout>
И изменим код MainActivity, определив для элемента Spinner слушатель OnItemSelectedListener:
package com.example.listapp;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
String[] countries = { "Бразилия", "Аргентина", "Колумбия", "Чили", "Уругвай"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView selection = findViewById(R.id.selection);
Spinner spinner = findViewById(R.id.spinner);
// Создаем адаптер ArrayAdapter с помощью массива строк и стандартной разметки элемета spinner
ArrayAdapter<String> adapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, countries);
// Определяем разметку для использования при выборе элемента
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// Применяем адаптер к элементу spinner
spinner.setAdapter(adapter);
AdapterView.OnItemSelectedListener itemSelectedListener = new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
// Получаем выбранный объект
String item = (String)parent.getItemAtPosition(position);
selection.setText(item);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
};
spinner.setOnItemSelectedListener(itemSelectedListener);
}
}
Метод onItemSelected слушателя OnItemSelectedListener получает четыре параметра:
parent: объект Spinner, в котором произошло событие выбора элемента
view: объект View внутри Spinnera, который представляет выбранный элемент
position: индекс выбранного элемента в адаптере
id: идентификатор строки того элемента, который был выбран
Получив позицию выбранного элемента, мы можем найти его в списке:
String item = (String)parent.getItemAtPosition(position);
Для установки слушателя OnItemSelectedListener в классе Spinner применяется метод setOnItemSelectedListener.