Recyclerview更換Adapter出現數據混亂
背景:
有A和B兩個Adapter,先給RecyclerView設定A,某種情況下再給RecyclerView設定B,A和B的item佈局相似度非常的高,現在的問題是我再互相切換adapter的時候會出現介面混亂,上面title的變化說明adapter已經切換了:

分析:
最開始直接用的setAdapter(A?B)來切換,不行.檢視方法,發現還有 mRecycler.removeAllViews()方法,在切換adapter的時候,先執行removeAllViews(),還是不行!繼續看原始碼,發現有個方法,
swapAdapter(Adapter adapter, boolean removeAndRecycleExistingViews)
看到這個方法我虎軀一震,來了個 swapAdapter(A?B,true) ,想著這下應該可以了吧,然而並沒有什麼卵用!還是有髒介面,仔細看了下引數 removeAndRecycleExistingViews ,原來他意思是:當引數2設定為true時,它的效果和setAdapter()一樣,舊的item會被回收重新用,設定為false,那麼全部的item都會被重新建立。
我虎軀又是一震,改程式碼為swapAdapter(A?B,false),執行一看,還是介面和資料都髒亂.以前我也用過切換adapter,屁事沒有,今天這bug已經超出我的想象和控制範圍了,有點凌亂了,背後也開始冒汗了......
RecyclerView的Adapter我用的是阿里的 ofollow,noindex">VLayou 和封裝後的DelegetAdapter,我在想是不是VLayout的鍋,把DelegetAdapter替換成最原生的RecyclerView.Adapter,執行還是沒什麼卵用。
能力不行得求助大神了,我微信了VLayout的原生開發這灰風大哥,大哥說
佈局不對就是Layouthelper不正確 讓我朝這個思路看看為什麼沒有設定新的layouthelper到virtuallayoutmanager。兩個Adapter的LayoutManager都是用的LinearLayoutManager,所以基本排除這個假設。
大哥建議我從新建立檢視,比如再放一個Recyc,通過控制顯示和隱藏來達到切換的目的.這雖是一種解決方法,但不是程式員所為!
然後我又想到是不是checkBox,畢竟CheckBox遇上Rcyc本身就是一種Bug,但是從上圖可以看出,不僅髒介面也髒資料,那說明不是CheckBox的鍋,排除。
這個小b功能因為這個Bug嚴重的耽誤了我的進度,然而我完全是束手無策,我特麼都悄悄求著UI小姐姐能不能把這噁心設計更改了。小姐姐僅僅用一個眼神殺死了我!
我頹廢的一邊想著其他方式實現這個設計,一邊想著放棄這種方式,也一邊想著為什麼會這樣?這個功能其實就是仿的釘釘的聯絡人組織架構,我想起之前用DDMS看過它是用ListView實現的(當時是想看他的橫向指示器是用的什麼控制元件實現的)。ListView,RecyclerView我突然又想到了什麼!!!
之前看面試題的時候,看到過Listview是二級快取,快取的view,而RecyclerView做的是四級快取,快取的是holde。
快取!!!
我大概已經知道是什麼原因了,翻開初始化RecyclerView的程式碼,看見有四行程式碼:

我默默將這四行程式碼刪除,執行,完美!!!!
這四句程式碼是給RecyclerView設定快取池,至於作用看圖片中的註釋就明白了。
解決辦法:
別給RecyclerView設定緩衝池。
結語:
講道理,無論我何種方式切換,無論我item的佈局是不是類似,無論是否設定了快取池,我特麼在切換的時候就不應該出現髒資料。谷歌大廠的Bug