Получение всех элементов из 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 и фрагменте.

Solutions Collecting From Web of "Получение всех элементов из ArrayAdapter"

Я немного опоздал в игру, но я столкнулся с подобной проблемой.

Один из способов борьбы с # 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; } } 

Решение, с которым я пошел, тем временем просто не использовать ArrayAdapter . В тех случаях, когда вы боретесь с этим API, кажется, что лучше использовать менее полнофункциональный (и сложный) BaseAdapter . Вы можете больше узнать о решении перейти с BaseAdapter вместо ArrayAdapter в этой статье: « Хорошая практика Android Adapter» .

Быстрый тест говорит, что метод 1 работает. Он кажется самым быстрым и чистым, но поскольку он недокументирован, вы можете протестировать его на всех запланированных платформах и всякий раз, когда они обновляются, в случае изменения базовой структуры ArrayAdapter.

Я использую компиляцию SDK версии 22 и мин SDK версии 10.

Лучший способ – «сохранить ссылку на список», но не передавать переменную / параметр «items» в конструктор:

List<DomainObject> items = new ArrayList<DomainObject>(); listAdapter = new ArrayAdapter<DomainObject>(getActivity(), R.layout.mine);

Таким образом, вы создаете экземпляр массива ArrayList как пустой массив, и вам придется самостоятельно управлять своим списком.

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

Я не думаю, что данные были бы оригинальными для Другой деятельности. Потому что, вы передавали бы элементы через bundle, поэтому объект сначала записывается в пакет, а затем в следующую активность, которую мы читаем из пакета.

Однако, если вы используете какой-либо другой способ передачи списка, используйте list.clone() для создания нового объекта вместо того, чтобы передавать оригинал.