我在底層數據更改時無法更新ListActivity。ListView在從BaseAdapter調用notifyDataSetChanged時不會更新
我正在使用自定義(列表)適配器(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內這應該登記的ListView的setAdapter方法(從ListActivity的setListAdapter調用)內的android.widget.AbsListView.AdapterDataSetObserver。
在通知已註冊的DataSetObserver對象有任何更改時,AdapterDataSetObserver的onChanged方法因此應調用ListView的requestLayout。這應該(以我的理解)刷新ListView。
但是,ListView未使用新數據更新。
我意識到已經指出notifyDataSetChanged和(可能)notifyChanged應該在runOnUiThread環境中運行,但是這似乎不能解決問題。
我也意識到類似的問題出現了,但沒有用這個特定的android類,並與不滿意的答案。
我錯過了什麼嗎?任何洞察,爲什麼這個打破和如何解決它是非常感謝。
請在您的文章或不使用簽名或標語(http://stackoverflow.com/faq#signatures)。 – meagar 2010-12-07 15:28:15