使用适配器动态更新listview

时间:2011-03-16 02:22:33

标签: android listview

This教程使用SimpleAdapter工作正常,但我需要在输入新数据时更新适配器中的数组。

您能否指导我如何使用SimpleAdapter以外的其他方式更新ListView?

6 个答案:

答案 0 :(得分:135)

使用由ArrayList支持的ArrayAdapter。要更改数据,只需更新列表中的数据并调用adapter.notifyDataSetChanged()

答案 1 :(得分:26)

如果您创建自己的适配器,则有一个值得注意的抽象函数:

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这样的东西,你不需要那么做吗?

答案 2 :(得分:3)

SimpleListAdapter主要用于静态数据!如果您想处理动态数据,最好使用ArrayAdapterListAdapterCursorAdapter,如果您的数据来自数据库。

这是useful tutorial in understanding binding data in a ListAdapter

在此SO question

中引用

答案 3 :(得分:0)

大多数人建议使用notifyDataSetChanged(),但我发现this link非常有用。事实上,使用clearadd,您可以使用更少的内存占用和更多的responsibe应用程序来实现相同的目标。

例如:

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 */

答案 4 :(得分:0)

我为此专门创建了一个方法。我需要手动更新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继承的适配器。应该适用于任何其他类型的适配器。

答案 5 :(得分:0)

csvadd方法更易于使用。他们更新列表中的数据,并在后台调用notifyDataSetChanged。

示例代码:

remove