【问题标题】:update listview dynamically with adapter使用适配器动态更新列表视图
【发布时间】:2011-07-16 06:37:14
【问题描述】:

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

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

【问题讨论】:

标签: android listview


【解决方案1】:

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

【讨论】:

  • 打败我。 :) 虽然您也可以在 SimpleAdapter 上调用 notifyDataSetChanged()。
【解决方案2】:

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

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 这样的东西而你不必做所有这些吗?

【讨论】:

    【解决方案3】:

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

    这是useful tutorial in understanding binding data in a ListAdapter

    正如SO question中所引用的那样

    【讨论】:

    • 我能够使用 notifyDataSetChanged() 更新 SimpleAdapter。您引用的另一个 SO 问题的链接也具有误导性,因为该帖子还说您无法更新 SimpleAdapter 中的数据。如果更新数组数据,并在 SimpleAdapter 上调用 notifyDataSetChanged(),数据将在 UI 上刷新和更新。
    • @dell116 SimpleList 旨在处理非可变数据项。您正在使用可变数据源并手动通知您的活动数据源已更改。这比它的价值更多,并且可能会使其他程序员感到困惑。我已经向您指出了能够处理可变数据的更好的数据结构。如果您不想解决它,那好吧,加倍努力,但我的答案是站得住脚的。我链接到您的 SO 问题有您的回复和修改后的答案。所以它也是有效的。
    • 诚然,当我第一次问这个问题时,我对 Android 一无所知,对编程也知之甚少。感谢您花时间指导我正确的方向。
    【解决方案4】:

    大多数人推荐使用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() ,您将清除整个列表,您尝试仅更新其中一个列表项并显示新内容。这行不通
    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多