我在更新 ListActivity 时遇到了困难,因为基础数据发生变化时无法进行更新。
我使用一个自定义 (列表) 适配器 (CustomListAdapter),它是从 BaseAdapter 派生出来的,用于填充 ListActivity 中的自定义列表元素 (CustomListElement)。
这些元素可能会随着时间的推移而更改其基础数据,无论是由用户交互还是由底层数据库的更改引起。为了宣布这些更改,CustomListElement 和 CustomListAdapter 对象可以注册 DataSetObserver 对象。
本质上是这样做的 (不幸的是发布整个代码会过度冗长):
因此,CustomListElement通过从DataSetObservable继承registerDataSetObserver并通过其notifyChanged()方法宣布更改。
至于CustomListAdapter:
我会尽力帮助您进行文本翻译。以下是需要翻译的内容:
我使用一个自定义 (列表) 适配器 (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类一起,并且答案令人不满意。
我是否遗漏了什么?非常感谢任何有关为什么会出现这种情况以及如何解决它的见解。