RecyclerView遇到notifyDataSetChanged無(wú)效時(shí)的解決方案

作者簡(jiǎn)介? 創(chuàng)微信公眾號(hào)郭霖 WeChat ID: guolin_blog

本篇來(lái)自CSDN_LQR的投稿珊随,分析了Fragment中使用RecyclerView時(shí)notifyDataSetChanged可能出現(xiàn)的問(wèn)題粘室,希望能夠幫助到大家倾鲫。

CSDN_LQR的博客地址:

http://www.reibang.com/u/f9de259236a3

簡(jiǎn)述

不管 AbsListView(ListView遣鼓、GridView) 或是 新出的RecyclerView,在使用 notifyDataSetChanged方法 更新列表數(shù)據(jù)時(shí)酸役,一定要保證數(shù)據(jù)為同個(gè)對(duì)象(即hashCode要一致)栗竖。對(duì)于這個(gè)問(wèn)題的論證癣漆,可以去看官方源代碼维咸,或是看我之前寫的一篇博文

解決ListViews適配器notifyDataSetChanged()無(wú)效問(wèn)題

http://blog.csdn.net/csdn_lqr/article/details/50947825

相信可以幫到你。但是惠爽,這個(gè)不是本文的重點(diǎn)癌蓖,本文重點(diǎn)講解在 Fragment 中,RecyclerView 遇到 notifyDataSetChanged 無(wú)效的問(wèn)題婚肆。如果你趕時(shí)間租副,可以直接看第三部分("總結(jié)")。

探索

1较性、查看數(shù)據(jù)(mData)是否是同個(gè)對(duì)象

tip:java中可以通過(guò)打印 hashCode 的方式判斷 mData 是否為同個(gè)對(duì)象用僧。

注意:initData方法 在 onActivityCreated() 中被調(diào)用。


2赞咙、操作與結(jié)果

tip:常規(guī)對(duì) Fragment 的使用责循,會(huì)對(duì)其進(jìn)行緩存,也可能使用單例模式攀操,反正就是短時(shí)間內(nèi)不會(huì)重新創(chuàng)建院仿。

①操作一

打開(kāi) Activity 后,切換 Fragment(第一次初始化 Fragment)崔赌。顯示效果如下:


②操作二

切換別的 Fragment 后意蛀,再切回剛才的 Fragment(此前該 Fragment 已經(jīng)在存在,所以不會(huì)再次創(chuàng)建)健芭。顯示效果如下:


③看控制臺(tái)


可以看到數(shù)據(jù)對(duì)象地址一樣县钥,即為同一個(gè)。

3慈迈、查看RecyclerView是否是同個(gè)對(duì)象

說(shuō)實(shí)話若贮,這個(gè)是踩坑經(jīng)驗(yàn)豐富的網(wǎng)友在群里說(shuō)的,如果不是他說(shuō)出來(lái)痒留,打死我也沒(méi)想到谴麦,居然還有這么一個(gè)坑。從上面的結(jié)果可以看出伸头,adapter 中是有數(shù)據(jù)的沒(méi)錯(cuò)匾效,而且數(shù)據(jù)地址沒(méi)變,所以理應(yīng) notifyDataSetChanged()方法 會(huì)生效恤磷。但是為什么會(huì)這樣呢面哼,這里先賣個(gè)關(guān)子野宜,先看下面的操作。

①改下上面的代碼魔策,打印RecyclerView的地址

代碼如下:


②同上述操作一致

對(duì)同一個(gè) Fragment 來(lái)回切換匈子,看控制臺(tái)輸出。


果然不一樣4程弧;⒍亍!

總結(jié)

為什么在 Fragment 中 RecyclerView 的地址會(huì)發(fā)生變化呢政敢?我們先理清一下 Fragment 生命周期會(huì)陸續(xù)調(diào)用的幾個(gè)方法:

onCreate()->onCreateView()->onActivityCreated()->onDestroy()

中間少了幾個(gè)方法其徙,請(qǐng)不用在意,下面貼下我的 BaseFragment 代碼:


當(dāng)一個(gè) Fragment 在來(lái)回切換時(shí)堕仔,分別調(diào)用的方法如下:

第一次顯示:

onCreate()->onCreateView()->onActivityCreated()

第二次顯示:

onCreateView()->onActivityCreated()

這里不難理解擂橘,因?yàn)?Fragment 一般使用的時(shí)候會(huì)被緩存,所以摩骨,當(dāng)?shù)诙物@示的時(shí)候通贞,不會(huì)調(diào)用 onCreate()。只會(huì)調(diào)用 onCreateView() 和 onActivityCreated()恼五,這也就是 RecyclerView 地址不一樣的原因所在昌罩,因?yàn)榭丶@取操作是在 initView() 中進(jìn)行的,即 RecyclerView 的獲取操作在 onCreateView() 中灾馒,而 Fragment 的每次顯示都會(huì)調(diào)用 onCreateView()茎用,所以 RecyclerView 控件會(huì)被再次獲取,即重新創(chuàng)建一個(gè)對(duì)象(此時(shí)hashCode就變化了)睬罗。

結(jié)論

所以轨功,在 Fragment 中使用 RecyclerView 或 AbsListView 控件的 notifyDataSetChanged()方法 時(shí),除了保證數(shù)據(jù)(mData對(duì)象)不能變以外容达,控件本身一樣也不能變古涧。

解決方案

因?yàn)?Fragment 的 onCreateView() 和 onActivityCreated() 方法在每次 Fragment 顯示的時(shí)候會(huì)被調(diào)用,控件會(huì)被重新創(chuàng)建一次花盐,所以羡滑,解決方法只能是在這兩個(gè)方法中重新對(duì)RecyclerView 設(shè)置適配器,而不要使用 notifyDataSetChanged()算芯,故代碼改為如下:


注:只是建議不要在上述兩個(gè)生命周期方法中使用 notifyDataSetChanged() 而已柒昏,只要在保證 RecyclerView 等列表控件設(shè)置完適配器后,可以在任意地方繼續(xù)使用 notifyDataSetChanged()熙揍。


文章原創(chuàng)作者GuoLin 書籍推薦

郭林大神原創(chuàng)android 書籍:《第一行代碼 android》

淘寶鏈接: https://s.click.taobao.com/t?e=m%3D2%26s%3DgKUfuKdAZKocQipKwQzePOeEDrYVVa64K7Vc7tFgwiHjf2vlNIV67p2n%2BQBNMyE6Rku8%2Bpj6eJall3bs%2B3NRhNHnsKI%2BqxhyM0iVZhTFBom4YIorMPnmg8G0g2OJi%2FzmXHfenomYtn5EW9vzeG8LzfPUwktUBEmkxg5p7bh%2BFbQ%3D&pvid=10_106.6.161.154_3367_1490163222155

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末职祷,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌堪旧,老刑警劉巖削葱,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奖亚,死亡現(xiàn)場(chǎng)離奇詭異淳梦,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)昔字,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門爆袍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人作郭,你說(shuō)我怎么就攤上這事陨囊。” “怎么了夹攒?”我有些...
    開(kāi)封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵蜘醋,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我咏尝,道長(zhǎng)压语,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任编检,我火速辦了婚禮胎食,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘允懂。我一直安慰自己厕怜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布蕾总。 她就那樣靜靜地躺著粥航,像睡著了一般。 火紅的嫁衣襯著肌膚如雪生百。 梳的紋絲不亂的頭發(fā)上递雀,一...
    開(kāi)封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音置侍,去河邊找鬼映之。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蜡坊,可吹牛的內(nèi)容都是我干的杠输。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼秕衙,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蠢甲!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起据忘,我...
    開(kāi)封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鹦牛,失蹤者是張志新(化名)和其女友劉穎搞糕,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體曼追,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡窍仰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了礼殊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驹吮。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖晶伦,靈堂內(nèi)的尸體忽然破棺而出碟狞,到底是詐尸還是另有隱情,我是刑警寧澤婚陪,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布族沃,位于F島的核電站,受9級(jí)特大地震影響泌参,放射性物質(zhì)發(fā)生泄漏脆淹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一及舍、第九天 我趴在偏房一處隱蔽的房頂上張望未辆。 院中可真熱鬧,春花似錦锯玛、人聲如沸咐柜。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)拙友。三九已至,卻和暖如春歼郭,著一層夾襖步出監(jiān)牢的瞬間遗契,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工病曾, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留牍蜂,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓泰涂,卻偏偏與公主長(zhǎng)得像鲫竞,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子逼蒙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容