天天看點

android viewpager中的fragment中的RecyclerView的adpter.notifyDataSetChanged不起作用

今天在寫viewpager中的fragmnent的時候遇到了奇怪的問題,我的fragment中用了RecyclerView,而我的viewpager中有多個這樣的fragment,業務要求最後實作在具體代碼上就是這些fragment中要互相通信,當然了,考慮到fragment中的生命周期和外面的viewpager也要通信,是以我采取了比較穩的辦法,就是通信全部用廣播來做,我的fragment的數量是11個的,而且不能銷毀滑過的頁面,因為一銷毀,再次通路的時候,就得重新重新整理資料,這個使用者體驗不是很好,可是最後問題出來了,廣播通知出去了,各個fragment也接收了,list的數量也變化了,notifyDataSetChanged對象指向重新整理也沒有任何問題,問題就是,如果兩個fragment的下标間隔超過一個,這個notifyDataSetChanged什麼用都沒有,可奇怪的是在相鄰兩個fragment之間發廣播,notifyDataSetChanged是沒有任何問題

     我起初一直認為是notifyDataSetChanged是不是認為對象沒有任何變化是以什麼事情都不做,可後來發現相鄰兩個fragment之間又是沒有任何問題的,這就排除了notifyDataSetChanged的問題,後來注意到viewpager的預加載機制,也就是

    viewPager.setOffscreenPageLimit(1)這句話,

如果不寫這句話,他就認為是一個,也就是說,他會緩存目前頁面的前一個後和後一個,我沒有時間去看系統源碼,因為項目比較着急,是以當我想到這裡的問題的時候,我把這個 (1)改成了11,也就是我的fragment的數量的時候,發現我前面的問題都不是問題了,順利解決掉,後來仔細想了下這個原因,雖然說那些fragment還活着,但是viewpager預設為我目前隻有三個頁面活着,且叫活着吧,認為其餘的都是沉睡的(就這麼比喻吧),是以我再去發廣播,他雖然能收到廣播,也能接收到資料,但就是認為睡着了,不給重新整理頁面,這也是為什麼我改成讓他預加載11個之後,就沒有任何問題的原因,但是這樣做的後果就是這11個fragment一旦牽扯到資料量比較大,大到記憶體撐不住的時候(目前單個app隻有32M) 這個頁面可能直接崩潰,這樣就要建議做資料持久化,記憶體消耗百分比去防止崩潰了

當然了,如果你有更好的辦法,那更好,希望不吝賜教!!

繼續閱讀