Android之使用RecyclerView出現髒數據解決

Android之使用RecyclerView出現髒數據解決

文章鏈接

知識點:

  1. RecyclerView出現髒數據空白問題;
  2. 問題分析解決方法;
  3. 新名詞記錄{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);

總結

以上就是今天遇到的一個問題,因爲直接看了源碼,看到這個方法的解釋,所以就能夠直接抓住重點了。解決問題。

如有任何問題,請及時與我聯繫,謝謝。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章