Список, що випадає Spinner

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 всередині Spinner, який представляє вибраний елемент.
  • position: індекс вибраного елемента в адаптері.
  • id: ідентифікатор рядка того елемента, який був вибраний.

Отримавши позицію вибраного елемента, ми можемо знайти його в списку:

String item = (String) parent.getItemAtPosition(position);

Для встановлення слухача OnItemSelectedListener в класі Spinner застосовується метод setOnItemSelectedListener.