Получение всех элементов из ArrayAdapter - программирование
Подтвердить что ты не робот

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

4b9b3361

Ответ 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() для создания нового объекта вместо того, чтобы передавать оригинал.