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);

总结

以上就是今天遇到的一个问题,因为直接看了源码,看到这个方法的解释,所以就能够直接抓住重点了。解决问题。

如有任何问题,请及时与我联系,谢谢。

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