Є два методи, щоб заповнити список:
- статично, створивши стрічковий масив string-array в файлі ресурсів res\values\strings.xml, або в окремому xml-файлі в папці values. Оскільки string-array належить до простого типу ресурсів, то і в першому і в другому випадках для його ідентифікації буде використано значення властивості name, а не назва xml-файлу;
- динамічно, під час виконання програми, використовуючи клас, що імплементує інтерфейс SpinnerAdapter, як наприклад ArrayAdapter, якщо дані для списку знаходиться в таблиці (може бути оголошена в тому ж таки string-array), або CursorAdapter, якщо ми їх отримаємо з бази даних.
В цій статті зупинюсь на статичному методі. На сайті андроїда чомусь знайшов інформацію тільки по динамічному методу. Тому з ним розібратись буде простіше, хоча для його реалізації потрібно написати кілька додаткових стрічок коду, щоб зв'язати адаптер і спінер. Потім реалізація одинакова - потрібно імплементувати інтерфейс AdapterView.OnItemSelectedListener.
Зразок стрічкового масиву в strings.xml (developer.android.com):
<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="planets_array"> <item>Mercury</item> <item>Venus</item> <item>Earth</item> <item>Mars</item> <item>Jupiter</item> <item>Saturn</item> <item>Uranus</item> <item>Neptune</item> </string-array> </resources>Розмір списку (кількість рядочків) ніде не вказується. Щоб додати, видалити чи змінити опцію, потрібно тільки відредагувати цей string-array (examples.javacodegeeks.com).
В xml-файлі для layout для віджета <Spinner /> потрібно вказати назву масиву, з якого буде отримано дані для заповнення спадного списку:
android:entries="@array/planets_array"
Також можна додати властивість android:prompt, яка створює заголовок для списку:
android:prompt="@string/select"
Коли користувач обирає якийсь елемент зі списку, об'єкт класу Spinner може реагувати на цю подію (on-item-selected event). Для цього потрібно реалізувати інтерфейс AdapterView.OnItemSelectedListener, який включає два методи (так як це інтерфейс, то потрібно реалізувати обидва):- onItemSelected() - метод, що реагує на подію, яка викликана вибором елементу зі списку. Викликається тільки тоді, коли новий обраний елеметн відрізняється від попереднього;
- onNothingSelected() - метод, що реагує на подію, яка виникає, коли вибір зникає зі списку. Таке може відбутися за певних умов, наприклад, коли адаптер стає пустим.
Нижче наведено код імплементування інтерфейсу у вигляді анонімного класу:
// оголошення змінної типу Spinner
Spinner spinner = (Spinner) findViewById(R.id.spinner1);// змінна, в яку буде записано номер обраного пункту в спінері.int choix = 0;
// прив'язка Listner'а до оголошеного об'єкту класу Spinner.spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {// Для цього використано анонімний клас.
// перший метод інтерфейсу OnItemSelectedListener
public void onItemSelected(AdapterView<?> adapterView,
View view, int position, long l)
{
choix = position;
Toast.makeText(MainActivity.this,"Choix : " +
choix ,Toast.LENGTH_SHORT).show(); }
// другий метод інтерфейсу OnItemSelectedListener
public void onNothingSelected(AdapterView<?> arg0)
{
// якщо не потрібно, то тіло метода можна залишити пустим
} }); // кінець анонімного класу Параметр int position методу onItemSelected містить позицію обраного пункту в спінері. Нумерація починається з нуля, тобто перший пункт має номер 0, другий - 1 і т.д. Щоб отримати саму стрічку, яка знаходиться в обраному пукті списку, можна використати метод класу AdapterView - getItemAtPosition(int position):
String s = adapterView.getItemAtPosition(int position);
Немає коментарів:
Дописати коментар