Android之使用RecyclerView出現髒數據解決
文章鏈接
知識點:
- RecyclerView出現髒數據空白問題;
- 問題分析解決方法;
- 新名詞記錄{swapAdapter():替換RecyclerView原有的adapter}
概述
今天在做RecyclerView的時候,從網格佈局轉成瀑布流佈局的時候,切換的時候,居然第一個item和後面的item有了好幾個item的空白區域。一時間百思不得其解。
之後一步一步分析,數據源和adapter應該都是沒問題的,然後在到最後設置adapter的方法了。點擊去看setAdapter()方法源碼。發現是這樣說的:當adapter改變了之後,所有存在的view都會被放到回收池中(放進去那麼就會被回收重新利用了嘛)。如果回收池中只有一個adapter,那麼此adapter就會被clear掉。
源碼:
public void setAdapter(Adapter adapter) {
// bail out if layout is frozen
setLayoutFrozen(false);
setAdapterInternal(adapter, false, true);
requestLayout();
}
看到上面的方法,簡單說一下:設置adapter的時候,首先解凍adapter,setLayoutFrozen(false)設置layout解凍,就是可以更新或者滑動等。recycleview在被凍結或者滾動(一下幾個方法:smoothScrollBy(),scrollBy(),scrollToPosition(),smoothScrollToPosition())的時候,視圖是不會被更新的。然後才調用setAdapterInternal()設置adapter。最後就要求重新刷新設置佈局。而已經存在的item會被回收到回收池中進行再利用。
這裏,我們可以看到一個關鍵的地方:存在的item會被回收利用。那麼這就可能產生了髒數據的理由了。
那麼,還有木有其它可以設置adapter的方法呢?
去查看源碼提供的方法,發現有這個方法:
public void swapAdapter(Adapter adapter, boolean removeAndRecycleExistingViews){}
首先看方法名,swap:交換,替換。然後我們看方法的解釋:用新提供的adapter替換當前的adapter。參數2是設置是否舊的adapter原有的item要不要回收重新利用。
當參數2設置爲true時,它的效果和setAdapter()一樣,舊的item會被回收重新用。設置爲false,那麼全部的item都會被重新創建。
看到這裏,這不就是我們想要的嗎?全部的view都重新創建,就不會有不必要的item出現了。
所以解決方法就是:調用RecyclerView的swapAdapter()方法,第二個參數設置爲false。
rv_fMvCompanyList.swapAdapter(adapter, false);
總結
以上就是今天遇到的一個問題,因爲直接看了源碼,看到這個方法的解釋,所以就能夠直接抓住重點了。解決問題。
如有任何問題,請及時與我聯繫,謝謝。