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

8
我在更新 ListActivity 时遇到了困难,因为基础数据发生变化时无法进行更新。
我使用一个自定义 (列表) 适配器 (CustomListAdapter),它是从 BaseAdapter 派生出来的,用于填充 ListActivity 中的自定义列表元素 (CustomListElement)。
这些元素可能会随着时间的推移而更改其基础数据,无论是由用户交互还是由底层数据库的更改引起。为了宣布这些更改,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中,这应该在ListView的setAdapter方法(从ListActivity的setListAdapter调用)中注册android.widget.AbsListView.AdapterDataSetObserver

通知任何更改的已注册DataSetObserver对象后,应调用AdapterDataSetObserver的onChanged方法,因此请求ListView的布局。这应该(据我理解)刷新ListView。

然而,ListView没有使用新数据进行更新。

我意识到已指出需要在runOnUiThread环境中运行notifyDataSetChanged和(可能)notifyChanged,但似乎无法解决问题。

我也意识到类似的问题出现了,但不是与这些特定的android类一起,并且答案令人不满意。

我是否遗漏了什么?非常感谢任何有关为什么会出现这种情况以及如何解决它的见解。


1
请在您的帖子中不要使用签名或标语 - user229044
3个回答

7
Adapter接口中的registerDataSetObserver()部分是为了让任何对数据集变化感兴趣的外部对象知道。一个ListView不应该对这些方法感兴趣...如果它的BaseAdapter内容发生变化,只需调用BaseAdapter.notifyDataSetChanged()即可通知ListView更新自身。

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

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

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

当然,除非您确实有其他需要了解此数据的对象,否则您不需要任何DataSetObserver内容。


ListView.invalidateViews()Adapter.notifyDataSetChanged()之间有什么区别吗? - Gaurav Agarwal

2
问题已解决。实际上,问题出在另一个地方(这里没有提到的一个中间类没有对更改做出适当反应)。初始代码运行良好。
非常感谢您的努力,

1
adapter.notifyDataSetChanged();

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