Лучший способ пополнить данные в ListAdapter (ListView) - PullRequest
2 голосов
/ 02 октября 2011

Я использую этот код для пополнения ListView данными после их изменения

// ListView lv;
// MyListAdapter la;
// DataClass dc;
dc.remove(object_id);
lv.setAdapter(la);

Это лучший способ, поскольку мы не можем использовать notifyDataSetChanged(), который доступен только в ArrayAdapter?

Решение

 //MyListAdapter.java

private ArrayList<DataSetObserver> observers = new ArrayList<DataSetObserver>();

public void registerDataSetObserver(DataSetObserver arg0) {
    observers.add(arg0);
}

public void unregisterDataSetObserver(DataSetObserver arg0) {
    observers.remove(arg0);
}

public void notifyDataSetChange() {
    for (DataSetObserver d : observers) {
        d.onChanged();
    }
}

public void remove(int position) {
    [DataClass object].remove(position);
    notifyDataSetChange();
} 

Ответы [ 3 ]

3 голосов
/ 02 октября 2011

Для CursorAdapter Я использую следующий код:

mAdapter.getCursor().requery();

Если вы используете пользовательский адаптер или как вы прокомментировали: только ListAdapter хотите использовать в качестве переменной-члена. Вместо использования private CustomAdapter mAdapter; (который я бы рекомендовал , избегайте создания ненужных объектов ).

Вы можете использовать DataSetObserver part и ListAdapter.registerDataSetObserver (наблюдатель DataSetObserver) . DataSetObserver.onChanged () будет вызываться реализацией BaseAdapter, поэтому он должен работать для всех адаптеров.

BaseAdapter.notifyDataSetChanged ():

public void notifyDataSetChanged() {
    mDataSetObservable.notifyChanged();
}
0 голосов
/ 14 февраля 2014

Кажется, вы думаете, что-то не так, как я. Как вы знаете, ListAdapter не уведомил DataSetChanged.

Кажется, что курсор лучше всего подходит для ListView. Док. говорит, что «часто эти данные поступают из курсора, но это не обязательно. ListView может отображать любые данные при условии, что они помещены в ListAdapter». Если вы проверите обе ссылки registerDataSetObserver ([ DataSetObserver ] 2 наблюдатель) , вы можете кое-что заметить. ListAdapter хорошо работает с курсором. Так почему бы вам не попробовать использовать другие адаптеры.

Я думаю, что лучший способ обновить адаптер - использовать или расширить BaseAdapter (с ListView). И используйте notifyDataSetChanged после изменения набора данных. В моем случае это работает хорошо и мягко (лишает законной силы просмотр списка и элементов, и позиция прокрутки только там! Не собирается в первую позицию).

0 голосов
/ 02 октября 2011

Вы можете использовать ArrayAdapter, который принимает списки вместо массивов.Таким образом, вы можете использовать notifyDataSetChanged () для него.

...