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.