本教程使用的SimpleAdapter可以正常工作,但是当输入新数据时,我需要更新适配器中的阵列。
您能指导我如何使用除SimpleAdapter之外的方法更新ListView吗?
Answers:
使用由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(如果数据来自数据库)。
正如这个SO问题中提到的
大多数人建议使用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 */
我为此创建了一个方法。每当需要手动更新时,都会使用它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
。应该适用于任何其他类型的适配器。