Обновить данные в Arrayadapter

У меня есть эта проблема, у меня есть

private ArrayList<CustomItem> items; 
private ArrayAdapter<CustomItem> arrayAdapter;

i показать данные, присутствующие в элементах, эти данные, которые я вижу в списке, теперь я хочу обновить данные и увидеть эти новые данные.

if (!items.isEmpty()) {
    items.clear(); // i clear all data
    arrayAdapter.notifyDataSetChanged(); // first change
    items = getNewData();// insert new data and work well
    arrayAdapter.notifyDataSetChanged();  // second change                                      
}

в первом изменении я вижу, что данные очищаются, но во втором изменении я не вижу новых данных в списке, я проверяю и элемент не пуст.

Я не знаю, где ошибка, можете ли вы мне помочь? лучшие регаты Антонио

Ответ 1

Предполагая, что функция getNewData() возвращает ArrayList<CustomItem>, вы можете изменить строку:

items=getNewData();

to

items.addAll(getNewData());

и посмотрите, работает ли это?

Ответ 2

Вот как я обновляю адаптер с новыми данными:

            if (arrayAdapter == null) {
                arrayAdapter = new CustomArrayAdapter(getActivity(), data);
                listview.setAdapter(userAutoCompleteAdapter);
            } else {
                arrayAdapter.clear();
                arrayAdapter.addAll(newData);
                arrayAdapter.notifyDataSetChanged();
            }

Ответ 3

ArrayList, созданный вами в классе Activity, является ссылочной переменной, которая содержит ту же ссылку на ArrayList в вашем классе Adapter, проходя через конструктор (когда вы инициализируете объект Adapter).

Однако, выполнив items = getNewData(), вы назначаете новую ссылку на items в своем классе Activity, ссылка в вашем классе Adapter остается прежней, поэтому вы не видите изменений на экране.


Это так:

personA: объект ArrayList в классе деятельности class

personB: объект ArrayList в классе адаптера class

PersonA и personB держат карту США (отдельно), а на экране отображается карта personB. Затем кто-то заменяет карту personA другой картой страны. Угадайте, что, на экране все еще отображается карта США.


Вместо того, чтобы изменять ссылку на items, вы должны использовать add(), remove(), clear() или addAll(), чтобы изменить данные items, а затем вызвать notifyDataSetChanged().