使用适配器动态更新listview


Answers:



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之类的东西,而您不必做所有这些事情?


4

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

这是了解ListAdapter中的绑定数据有用教程。

正如这个SO问题中提到的


我能够使用notifyDataSetChanged()更新SimpleAdapter。您引用的指向另一个SO问题的链接也具有误导性,因为该帖子还说您无法更新SimpleAdapter中的数据。如果更新数组数据,然后在SimpleAdapter上调用notifiyDataSetChanged(),则将在UI上刷新和更新数据。
dell116 2011年

4
@ dell116 SimpleList用于处理非可变数据项。您正在使用可变数据源,并手动通知您的活动数据源已更改。这项工作比其应有的价值还多,可能会使其他程序员感到困惑。我已向您指出了可以处理可变数据的更好的数据结构。如果您不想解决此问题,那就更好,再努力一点,但是我的回答是正确的。我链接到您的SO问题既有您的回答,也有经过修改的答案。因此它也是有效的。
Dominic Tancredi

1
诚然,当我第一次问这个问题时,我对Android一无所知,而对编程一无所知。感谢您抽出宝贵时间指导我正确的方向。
dell116 '18

0

大多数人建议使用notifyDataSetChanged(),但是我发现此链接非常有用。实际上,使用clearadd您可以使用更少的内存占用量和更多的响应应用程序来实现相同的目标。

例如:

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

如果您在此处使用.clear(),则将清除整个列表,在该列表中您尝试更新列表项之一并显示新内容。这行不通
sweetiewill '16

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。应该适用于任何其他类型的适配器。


0

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

样例代码:

adapter.add("your object");
adapter.remove("your object");
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.