отображение объектов в счетчике, а не просто строк

Я строю диалог со спиннером. Когда диалог завершен, он вызывает метод родительского действия со строковым аргументом, причем аргумент представляет собой выбранное строковое значение.

Мой текущий подход:
я настраиваю адаптер массива счетчика следующим образом:

ArrayAdapter<String> adapter = 
    new ArrayAdapter<String>(getActivity(), android.R.layout.simple_spinner_item,
    categoryNames);     

adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mySpinner.setAdapter(adapter);

categoryNames — это массив строк. Когда диалог завершен, выбранный categoryName используется в качестве параметра для вызова метода родительского действия.

Что я действительно хочу сделать
На самом деле я хочу отобразить список из Category объектов. Класс Category имеет 2 свойства — categoryId и categoryName. Счетчик должен по-прежнему отображать categoryName в раскрывающемся списке, но когда диалоговое окно будет готово, он должен быть в состоянии однозначно сказать, какой Category был выбран, и вызвать метод обратного вызова родительского действия с categoryId выбранной категории.

Может быть несколько Category с одним и тем же categoryName.

Вопрос: Как это сделать?


person jrharshath    schedule 20.09.2012    source источник
comment
Хотя я уже опубликовал ответ, если имена категорий не уникальны, как пользователь отличит одно и то же имя (например, музыка от музыки)?   -  person Sam    schedule 20.09.2012
comment
я использовал метафору category и categoryName, чтобы упростить мой вариант использования :)   -  person jrharshath    schedule 20.09.2012


Ответы (1)


Есть несколько разных способов сделать то, что вы хотите:

  • Храните дополнительные данные в адаптере, например SimpleAdapter, SimpleCursorAdapter или пользовательский.
  • Используйте коллекцию пользовательских объектов вместо строк, просто переопределите метод toString(), чтобы представить строки, читаемые пользователем, в Spinner.

Кажется, вы хотите сделать второй вариант, поэтому вот общий пример:

class Category {
    int id;
    String name;

    public Category(int id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public String toString() {
        return name;
    }
}

Ваш ArrayAdapter почти такой же:

List<Category> categories = new ArrayList<Category>();
// Add new items with: categories.add(new Category(0, "Stack");

ArrayAdapter<Category> adapter = 
        new ArrayAdapter<Category>(getActivity(), android.R.layout.simple_spinner_item,
        categories);

...
mySpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        Category category = parent.getItemAtPosition(position);
        Log.v("Example", "Item Selected id: " + category.id + ", name: " + category.name);
    }

    public void onNothingSelected(AdapterView<?> parent) {}
});
person Sam    schedule 20.09.2012
comment
Хм, это ставит передо мной вторую задачу: когда я передаю массив объектов Category моему фрагменту диалога (это мой диалог), как мне сохранить его в arguments фрагмента? Я не смог найти ни одного метода Bundle#setObjectArray().. - person jrharshath; 20.09.2012
comment
Ха! Я только что ответил на другой вопрос, используя Bundles для передачи ArrayList пользовательских объектов. - person Sam; 20.09.2012
comment
Нашел ваш ответ о посылках очень полезным :) Для справки, я выбрал подход toString() (хотя с пуристской точки зрения это не совсем правильное решение). Было бы здорово, если бы вы могли указать мне несколько примеров того, как создать собственный адаптер. - person jrharshath; 21.09.2012
comment
Ромен Гай из Android обсуждает пользовательские адаптеры на Google I/O 2009. Я сам люблю исходный код, если у вас нет собственной копии, grepcode.com — отличный источник. (Вы также можете ускорить чтение некоторых учебных пособий из поисковой системы.) Пользовательский адаптер не слишком поможет вам, если вы отображаете только одну строку, но по мере роста вашего объекта ваше приложение получит ощутимые преимущества. - person Sam; 21.09.2012