使用适配器动态更新列表视图

71

本教程使用的是SimpleAdapter,它工作得很好,但当输入新数据时,我需要更新适配器中的数组。

请问你能否指导我如何使用除SimpleAdapter之外的其他方法来更新ListView?


1
请查看以下问题以获取更多信息:https://dev59.com/_XE95IYBdhLWcg3wluwg - hcpl
5个回答

140

4
抢我一步了。:) 尽管在SimpleAdapter上也可以调用notifyDataSetChanged()。 - Squonk

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

我能够使用notifyDataSetChanged()更新SimpleAdapter。你提到的链接指向的其他SO问题也是误导性的,因为那篇文章也说你不能更新SimpleAdapter中的数据。如果你更新数组数据,并在SimpleAdapter上调用notifyDataSetChanged(),数据将在UI上得到刷新和更新。 - dell116
4
SimpleList适用于非可变数据项,你正在使用可变的数据源并手动通知Activity数据源已更改。这样做比值得的工作要多,还可能会让其他程序员感到困惑。我已经向你指出了更好的数据结构,可以处理可变数据。如果不想解决它,那就努力工作吧,但我的答案依然有效。我给你提供的SO问题中也有你的回答以及修改后的答案,所以这个问题也是有效的。 - Dominic Tancredi
1
诚然,当我第一次提出这个问题时,我对Android一无所知,对编程也知之甚少。感谢您抽出时间指导我朝着正确的方向前进。 - dell116

0

大多数人推荐使用notifyDataSetChanged(),但我发现this link非常有用。实际上,使用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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接