Ответ 1
Используйте ArrayAdapter, поддерживаемый ArrayList. Чтобы изменить данные, просто обновите данные в списке и вызовите adapter.notifyDataSetChanged().
В этом учебнике используется SimpleAdapter, который отлично работает, но мне нужно обновить массивы в адаптере при вводе новых данных.
Не могли бы вы посоветовать мне, как обновить ListView, используя что-то еще, чем SimpleAdapter?
Используйте ArrayAdapter, поддерживаемый ArrayList. Чтобы изменить данные, просто обновите данные в списке и вызовите adapter.notifyDataSetChanged().
Если вы создаете свой собственный адаптер, есть одна заметная абстрактная функция:
public void registerDataSetObserver(DataSetObserver observer) {
...
}
Вы можете использовать данные наблюдатели для уведомления об обновлении системы:
private ArrayList<DataSetObserver> observers = new ArrayList<DataSetObserver>();
public void registerDataSetObserver(DataSetObserver observer) {
observers.add(observer);
}
public void notifyDataSetChanged(){
for (DataSetObserver observer: observers) {
observer.onChanged();
}
}
Хотя вы не рады, что есть такие вещи, как SimpleAdapter и ArrayAdapter, и вам не нужно все это делать?
SimpleListAdapter в основном используется для статических данных! Если вы хотите обрабатывать динамические данные, вам лучше работать с ArrayAdapter, ListAdapter или с CursorAdapter, если ваши данные поступают из базы данных.
Здесь полезное руководство по пониманию данных привязки в ListAdapter
Как указано в этом вопросе fooobar.com/questions/95542/...
Большинство людей рекомендуют использовать notifyDataSetChanged()
, но я нашел эту ссылку довольно полезной. Фактически, используя clear
и add
, вы можете достичь той же цели, используя меньшее количество памяти и более ответственное приложение.
Например:
notesListAdapter.clear();
notes = new ArrayList<Note>();
notesListAdapter.add(todayNote);
if (birthdayNote != null) notesListAdapter.add(birthdayNote);
/* no need to refresh, let the adaptor do its job */