Android: Spinner с изменяющимся ArrayAdapter - как определить? - PullRequest
0 голосов
/ 17 марта 2011

Я хочу иметь три счетчика, содержимое которых зависит друг от друга.

Например, Spinner1 отображает {item1, item2} и Spinner2 либо {item3, item4} или {item5, item6} в зависимости от того, выбран ли item1 или item2 на Spinner1.То же самое я хочу для Spinner 3, который реагирует на изменения Spinner1 и / или Spinner2.

Для последнего я должен сначала определить, какой из возможных наборов значений отображается в atm в Spinner2.

Мой вопрос похож на этот вопрос , но я не знаю, что делать после получения адаптера.

Это то, что у меня пока есть:

ArrayAdapter adapter1 = (ArrayAdapter) spinner2.getAdapter();
if(items_spinner1[0].contentEquals(adapter1.getItem(0)))
{
    //...
}

Я получаю адаптер, спрашиваю первое значение и сравниваю его с первым значением String моего массива, чтобы определить его.Это вовсе не кажется мне элегантным.Есть ли более простое решение?

1 Ответ

0 голосов
/ 17 марта 2011

Вы говорите, что содержимое более поздних блесен зависит от выбора в более ранних, но отправленный вами код зависит только от содержимого блесны.

adapter1.getItem(0) возвращает первый элемент в списке, а не текущий выбранный элемент.Чтобы получить выбранный в данный момент элемент, используйте метод прядильщика (а не адаптера) getSelectedItem().

Например, вы можете поместить что-то подобное в onItemSelectedListener вашего первого Spinner (отредактировано на основе ваших комментариев ниже):

public void onItemSelected (AdapterView<?> parent, View view, int position, long id) {
    Object selectedItem = parent.getSelectedItem();

    // Do this if the first Spinner has a set of options that are
    // known in advance.
    if (/*selectedItem is something*/) {
        // Set up the second Spinner in some way
    } else if (/*selectedItem is something else*/) {
        // Set up the second Spinner in another way
    }

    // OR, if you need to do something more complex
    // that would cause too much clutter here, do this.
    fillSecondSpinner(selectedItem);
}

Затем поместите что-то похожее во второй Spinner в OnItemSelectedListener.Получите выбранные предметы из первого и второго счетчиков, используя getSelectedItem() (или позиции элементов, используя getSelectedItemId() для первого и параметр позиции для второго).Используйте выбранные элементы для настройки третьего.

Редактировать: OnItemSelectedListener для второго Spinner будет выглядеть примерно так:

// This must be defined in the enclosing scope.
final Spinner firstSpinner;  // Must be final to be accessible from inner class.
Spinner secondSpinner;
// ...
secondSpinner.setOnItemSelectedListener(new OnItemSelectedListener {
    public void onItemSelected (AdapterView<?> parent, View view, int position, long id) {
        // Again, usually the selected items should be of
        // a more specific type than Object.
        Object firstSelection = firstSpinner.getSelectedItem();
        Object secondSelection = parent.getSelectedItem();

        fillThirdSpinner(firstSelection, secondSelection);
    }

public void onNothingSelected (AdapterView<?> parent) { }
});
...