簡體   English   中英

從BaseAdapter調用notifyDataSetChanged時,ListView不會更新

[英]ListView does not update when calling notifyDataSetChanged from a BaseAdapter

我很難在基礎數據發生變化時更新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中,這應該在ListView的setAdapter方法中注冊一個android.widget.AbsListView.AdapterDataSetObserver (從ListActivity的setListAdapter調用)。

在通知已注冊的DataSetObserver對象任何更改時,應調用AdapterDataSetObserver的onChanged方法以及ListView的requestLayout。 這應該(據我的理解)刷新ListView。

但是,ListView不會使用新數據進行更新。

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

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

我錯過了什么嗎? 任何洞察為什么這個打破以及如何解決它非常感謝。

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

換句話說,您只需進行以下微小更改:

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

實際上,由於您正在更改現有項的狀態(而不是添加新項等),因此notifyDataSetInvalidated()將是更好的選擇。

當然,除非您確實在其他地方有其他需要了解此數據的對象,否則您不需要任何DataSetObserver。

adapter.notifyDataSetChanged();

問題得到解決。 問題實際上是在一個不同的點(這里沒有提到的中間類沒有對變化作出適當的反應)。 初始代碼工作得很漂亮。

非常感謝你的努力,

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM