2010-12-07 46 views
8

我在底層數據更改時無法更新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方法因此應調用L​​istView的requestLayout。這應該(以我的理解)刷新ListView。

但是,ListView未使用新數據更新。

我意識到已經指出notifyDataSetChanged和(可能)notifyChanged應該在runOnUiThread環境中運行,但是這似乎不能解決問題。

我也意識到類似的問題出現了,但沒有用這個特定的android類,並與不滿意的答案。

我錯過了什麼嗎?任何洞察,爲什麼這個打破和如何解決它是非常感謝。

+1

請在您的文章或不使用簽名或標語(http://stackoverflow.com/faq#signatures)。 – meagar 2010-12-07 15:28:15

回答

7

Adapter接口的registerDataSetObserver()部分適用於任何可能有興趣知道數據集更改的外部對象。 A ListView不應該真的對這些方法感興趣......如果它的內容發生變化,請致電BaseAdapter.notifyDataSetChanged(),它會告訴ListView自行更新。

換句話說,你只需要作以下微小的變化:

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

實際上,因爲你改變現有項目的狀態(而不是增加新的等),然後notifyDataSetInvalidated()將是一個更好的選擇。

當然你不需要任何DataSetObserver的東西,除非你確實有別的對象需要知道這些數據。

+0

`ListView.invalidateViews()`和'Adapter.notifyDataSetChanged()'之間是否有區別? – 2012-05-20 19:56:45

1

問題已解決。問題實際上在另一個點上(這裏沒有提到的中間階層沒有對變化做出適當的反應)。最初的代碼工作得很好。

感謝很多的努力,

+7

你應該編輯這個信息到你的問題 – meagar 2010-12-07 15:28:44

相關問題