簡體   English   中英

數組適配器notifyDataSetChanged()將不起作用

[英]Array Adapter notifyDataSetChanged() will not work

我在這個上浪費了太多時間,所以不得不再問一次。 我不知道為什么會發生這種情況。

我有一個數組適配器(aAdapter)和一個數組列表(aList),我試圖用一個清除按鈕來清除數據庫中的條目並清除列表。

我的問題是NotifyDataSetChanged()只是在我的onlick方法中不起作用:

public void clearDB(View view) {
    aList.clear();
    aAdapter.notifyDataSetChanged();
    HighScoresDB hsdb = new HighScoresDB(HighScoresActivity.this);
    hsdb.openDB();
    hsdb.clearDB();
    hsdb.closeDB();

}

它適用於其他任何地方。 我甚至嘗試將clear和notifyDataSetChanged()放在另一個方法中並調用它但是這也不起作用但是當我從onCreate調用它時它確實有效....

有任何想法嗎?

ps正在清除數據庫。

首先,我發現Android適配器實現存在很大缺陷。 當談到執行任何定制時,似乎有關於如何使用它的模糊描述,官方文檔沒有澄清其中任何一個。 我很高興被證明是錯的。

在視圖中編輯數據時,我獲得一致結果的方式如下:

  • 所呈現的基礎數據結構的所有更改都應該在AsyncTask中完成,這在您更改UI線程上的內容並且不希望出現並發問題時是有意義的。

  • 底層數據結構的操作應該通過調用適配器方法來執行,所以如果你有一個ListAdapter那么你可以使用addremoveclear列表適配器。 這意味着適配器管理視圖通知等。這通常導致必須創建自定義適配器,因為可用的方法是有限的(在7之前甚至沒有添加所有sdk版本)。 最后你的適配器充當了一個大胖控制器 ,雖然我知道我們不應該將android視為MVC模式,但它似乎仍然是錯誤的。

  • 我已經創建了應用程序,我繞過適配器調用來操作底層數據結構,它已經完成所有結果,最終變得不可預測,除非你嚴格管理通知到視圖。 現在我只需通過適配器調用。

所以雖然我無法解釋為什么notifiyDataSetChanged在你的onClick方法中不起作用。 我希望提供有用的信息,可以幫助您使應用程序按預期工作。

雖然不漂亮,但您可以重新初始化適配器而不是通知它,我已經看到有時它是使其工作的唯一方法。

因此,我處理類似問題的一種方法是基本上重新初始化適配器,就像blindstuff所說的那樣。

    public class Example extends Activity{
        CustomAdapter adapter;
        ArrayList<ArrayList<String>> info = new ArrayList<ArrayList<String>>();
        final ListView list = (ListView) findViewById(R.id.listView_custom);
        adapter = new CustomAdapter(this, diceInfo.get(id));
        list.setAdapter(adapter);

然后在onclick Listener中

add.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                info.get(id).add("1,0,0,true");
                adapter = new CustomAdapter(Example.this, info.get(id));
                list.setAdapter(adapter);
            }
        });

該示例沒有初始化所有內容,但它已達到目的。 我只是創建一個新的適配器並將其設置為我的列表視圖。 效果很好。

當在對話框中使用時,還遇到了適配器的奇怪行為。 一旦適配器更新(或底層結構 - 兩種方式)和notifiyDataSetChanged對話框消失,沒有錯誤或LogCat中的其他跟蹤或Eclipse的調試。 完全相同的代碼,一旦適配器應用於正常活動(ListView)工作正常。

我想這個帖子不再有效了,但是為了將來的參考:

根據developer.android.com

[onNotifyDataSetChanged()]通知附加的觀察者基礎數據已被更改,反映數據集的任何視圖都應自行刷新。

不要讓Adapter告訴View刷新自己,只需使用adapter.clear()和adapter.add()更新數據,然后再次通過調用listView.setAdapter(adapter)強制ListView更新。

暫無
暫無

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

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