【发布时间】:2011-07-16 06:37:14
【问题描述】:
This 教程使用 SimpleAdapter 工作正常,但我需要在输入新数据时更新适配器中的数组。
能否请您指导我如何使用 SimpleAdapter 以外的方式更新 ListView?
【问题讨论】:
-
查看此问题以获取更多信息stackoverflow.com/questions/2250770/…
This 教程使用 SimpleAdapter 工作正常,但我需要在输入新数据时更新适配器中的数组。
能否请您指导我如何使用 SimpleAdapter 以外的方式更新 ListView?
【问题讨论】:
使用由 ArrayList 支持的 ArrayAdapter。要更改数据,只需更新列表中的数据并调用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(如果您的数据来自数据库)。
这是useful tutorial in understanding binding data in a ListAdapter
正如SO question中所引用的那样
【讨论】:
大多数人推荐使用notifyDataSetChanged(),但我发现this link 非常有用。事实上,使用 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 */
【讨论】:
我为此创建了一个方法。每当我需要手动更新ListView 时,我都会使用它。希望这能让您了解如何实现自己的
public static void UpdateListView(List<SomeObject> SomeObjects, ListView ListVw)
{
if(ListVw != null)
{
final YourAdapter adapter = (YourAdapter) ListVw.getAdapter();
//You'll have to create this method in your adapter class. It's a simple setter.
adapter.SetList(SomeObjects);
adapter.notifyDataSetChanged();
}
}
我正在使用继承自 BaseAdapter 的适配器。应该适用于任何其他类型的适配器。
【讨论】: