Adapter notifyDataSetChanged()無法刷新

在使用ListView需要動態刷新數據的時候,經常會用到notifyDataSetChanged()函數。
以下為兩個使用的錯誤實例:

1、
無法刷新:

private List<RecentItem> recentItems; 
......
recentItems = getData()         
mAdapter.notifyDataSetChanged();

正常刷新:

private List<RecentItem> recentItems; 
......
recentItems.clear();
recentItems.addAll(getData); 
mAdapter.notifyDataSetChanged();

原因:
mAdapter通過構造函數獲取List a的內容,內部保存為List b;此時,a與b包含相同的引用,他們指向相同的對象。
但是在語句recentItems = getData()之后,List a會指向一個新的對象。而mAdapter保存的List b仍然指向原來的對象,該對象的數據也并沒有發生改變,所以Listview并不會更新。

2、
我在頁面A中綁定了數據庫的數據,在頁面B中修改了數據庫中的數據,希望在返回頁面A時,ListView刷新顯示。
無法刷新:

protected void onResume() {
mAdapter.notifyDataSetChanged();
super.onResume();
}

正常刷新:

protected void onResume() {
recentItems.clear();
recentItems.addAll(recentDB.getRecentList());
mAdapter.notifyDataSetChanged();
super.onResume();
}

原因:
mAdapter內部的List指向的是內存中的對象,而不是數據庫。所以改變數據庫中的數據,并不會影響該對象。

void notifyDataSetChanged()
Notifies the attached observers that the underlying data has been changed and any View reflecting the data set should refresh itself.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,466評論 25 708
  • ¥開啟¥ 【iAPP實現進入界面執行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,537評論 0 17
  • 簡介 在Android開發中ListView是比較常用的組件。 以列表的形式展示具體內容。 并且能夠根據數據的長度...
    上善若水Ryder閱讀 7,000評論 2 5
  • 我是骨子里透著小氣的一種人,這種小氣,讓我受傷很大; 因為小氣,不愿意投入,總想從精神方面的免費投入來獲取肉體的充...
    真實思考閱讀 999評論 0 51
  • 1 上大學時,我們班有一對關系特別好的朋友,好的恨不得每天都在一起。 她們每天一起早晨打卡,一起去上課,然后中午吃...
    公子涼閱讀 728評論 0 2