Получение всех элементов из ArrayAdapter
У меня есть ListFragment
, поддерживаемый ArrayAdapter
, который заполняется Loader
. Когда пользователь нажимает на один из элементов, я хочу передать ссылку на выбранный элемент, а также остальные элементы списка на другой фрагмент. Мой вопрос: как мне получить все предметы из адаптера? Вот возможности, которые я вижу:
1. Сохраните ссылку на резервную копию List
Создайте адаптер так:
List<DomainObject> items = new ArrayList<DomainObject>();
listAdapter = new ArrayAdapter<DomainObject>(getActivity(), R.layout.mine, items);
а затем просто передать items
или его копию в следующую операцию.
Недостаток, который я вижу в этом, заключается в том, что я полагаюсь на недокументированный факт, что тот же список, который я передаю конструктору, содержит элементы позже.
2. Итерация через адаптер
Когда элемент щелкнут, пройдите через адаптер и создайте список. Это кажется ненужным количеством работы. Элементы содержатся в List
в адаптере, и я вручную копирую каждый элемент в новый список.
3. Сохраняйте отдельный список элементов при добавлении в адаптер
Перед добавлением элемента в адаптер добавьте его в отдельный список, который я поддерживаю в фрагменте. Это также бесполезно, поскольку список элементов копируется в ArrayAdapter
и фрагменте.
Ответы
Ответ 1
Решение, с которым я пошел, тем временем просто не использовать ArrayAdapter
. В тех случаях, когда вы боретесь с этим API, кажется, что лучше использовать менее полнофункциональный (и сложный) BaseAdapter
. Вы можете больше узнать о решении пойти с BaseAdapter
вместо ArrayAdapter
в этой статье: Хорошие практики Android Adapter.
Ответ 2
Я немного опаздываю в игру, но я столкнулся с подобной проблемой.
Один из способов борьбы С# 1 - поддерживать ссылку на список в подклассе ArrayAdapter
, чтобы ваше повторное использование контролировалось объектом адаптера.
Что-то вроде:
public class DomainAdapter extends ArrayAdapter<DomainObject> {
private final List<DomainObject> items;
public DomainAdapter(Context context, List<DomainObject> items) {
super(context, R.layout.mine, items);
this.items = items;
}
public List<DomainObject> getItems() {
return items;
}
}
Ответ 3
Быстрый тест говорит, что метод 1 работает. Он кажется самым быстрым и чистым, но поскольку он недокументирован, вы можете протестировать его на всех запланированных платформах и всякий раз, когда они обновляются, в случае изменения базовой структуры ArrayAdapter.
Я использую компиляцию SDK версии 22 и мин SDK версии 10.
Ответ 4
Лучший способ - "сохранить ссылку на список", но не передавать переменную/параметр "items" в конструктор:
List<DomainObject> items = new ArrayList<DomainObject>();
listAdapter = new ArrayAdapter<DomainObject>(getActivity(), R.layout.mine);
Таким образом вы создаете экземпляр ArrayList только как пустой массив, и вам придется самостоятельно управлять своим списком.
Ответ 5
Я думаю, что первым методом является лучший способ сделать это.
Я не думаю, что данные были бы оригинальными для Другой деятельности. потому что, вы передавали бы элементы через связку, поэтому объект сначала записывается в пакет, а затем в следующем Управлении, которое мы читаем из пакета.
Однако, если вы используете какой-либо другой способ передачи списка, используйте list.clone()
для создания нового объекта вместо того, чтобы передавать оригинал.