当基础数据发生变化时,我很难更新 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/