android - 从 BaseAdapter 调用 notifyDataSetChanged 时,ListView 不会更新

标签 android android-widget

当基础数据发生变化时,我很难更新 ListActivity。

我正在使用自定义(列表)适配器 (CustomListAdapter) 派生的 vom BaseAdapter 来使用自定义列表元素 (CustomListElement) 填充 ListActivity。

相关元素的基础数据可能随着时间的推移而改变,无论是通过用户交互还是通过基础数据库的改变。为了宣布上述更改,CustomListElement 和 CustomListAdapter 对象可以注册 DataSetObserver 对象。

这在本质上是这样完成的(不幸的是,发布整个代码会有点矫枉过正):

public class CustomListElement extends DataSetObservable {

    protected Object value;

    public void setValue(Object newValue) {
         this.value = newValue;
         notifyChanged();
    }
}

因此,CustomListElement 通过从 DataSetObservable 继承来提供 registerDataSetObserver,并通过它的 notifyChanged() 方法宣布更改。

对于 CustomListAdapter:

public class CustomListAdaper extends BaseAdapter {

    protected List<CustomListElement> elementList;

    @Override
    public void registerDataSetObserver(DataSetObserver observer) {
        super.registerDataSetObserver(observer);

        for (CustomListElement element : elementList)
            element.registerDataSetObserver(observer);
    }
}

即观察员“通过”。

现在,调用时

setListAdapter(new CustomListAdapter(customElementList));

在 ListActivity 中,这应该注册一个 android.widget.AbsListView.AdapterDataSetObserver在 ListView 的 setAdapter 方法中(从 ListActivity 的 setListAdapter 调用)。

在通知已注册的 DataSetObserver 对象发生任何更改时,AdapterDataSetObserver 的 onChanged 方法以及因此应调用 ListView 的 requestLayout。这应该(据我所知)刷新 ListView。

但是,ListView 不会用新数据更新。

我意识到有人指出 notifyDataSetChanged 和(也许)notifyChanged 应该在 runOnUiThread 环境中运行,但这似乎并不能解决问题。

我也意识到类似的问题出现了,但不是针对这组特定的 android 类,而且答案也不令人满意。

我错过了什么吗?非常感谢任何关于为什么会中断以及如何修复它的见解。

最佳答案

Adapter 接口(interface)的 registerDataSetObserver() 部分适用于可能有兴趣了解数据集更改时间的任何外部对象。 ListView 不应该真正对这些方法感兴趣...如果它是 BaseAdapter 内容更改,您调用 BaseAdapter.notifyDataSetChanged() 它将告诉 ListView 更新自己。

换句话说,您只需要进行以下微小的更改:

public void setValue(Object newValue) {
     this.value = newValue;
     notifyDataSetChanged();
}

实际上,由于您正在更改现有项的状态(而不是添加新项等),因此 notifyDataSetInvalidated() 将是更好的选择。

当然,您不需要任何 DataSetObserver 的东西,除非您在别处确实有其他对象需要了解此数据。

关于android - 从 BaseAdapter 调用 notifyDataSetChanged 时,ListView 不会更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4375931/

相关文章:

Android:为同一接入点获取不同的bssid

android - 使用我的联系人列表中的服务向所有使用 whatsapp 的联系人发送消息

android - 无法在 HTC HERO 中删除超过 200 个联系人

android - 将序列化的接口(interface)对象从 Activity 解析为 fragment

android - 整个代码如何处理Android ActionBar代码?

android - 手电筒应用程序(如何将屏幕亮度设置为最大?)

android - 在android中创建自定义警报框

android - 如何将 Android 小部件添加到我的应用程序?

android - 在android应用程序中显示树结构(父子节点)

android - 在图像上缩放图像点击事件