RecyclerView 刷新闪烁

2019-05-21 12:37:34

参考地址 https://www.jianshu.com/p/4a2b18135447   这个没试过,不知道有没有用

前言

最近做项目,使用 RecycleView + SwipeRefreshLayout 刷新时,列表总是闪烁。

1、为什么会闪烁?
闪烁是 notifyDataSetChange 造成的。由于适配器不知道整个数据集中的哪些内容已经存在,在重新匹配 ViewHolder 时发生的。

当然,遇到这个问题时有去搜索一些答案,看到的很多都是去禁止 RecycleView 的默认动画,可惜这对我没什么用。下面的方法是对我有用的。

2、设置 setHasStableIds

下面给大家介绍一个方法 setHasStableIds

        /**
         * Indicates whether each item in the data set can be represented with a unique identifier
         * of type {@link java.lang.Long}.
         *
         * @param hasStableIds Whether items in data set have unique identifiers or not.
         * @see #hasStableIds()
         * @see #getItemId(int)
         */
        public void setHasStableIds(boolean hasStableIds) {            if (hasObservers()) {                throw new IllegalStateException("Cannot change whether this adapter has "
                        + "stable IDs while the adapter has registered observers.");
            }
            mHasStableIds = hasStableIds;
        }

long 类型的标识可以表示数据集中的每个项目。

DemoAdapter  mAdapter=new DemoAdapter();
mAdapter.setHasStablesId(true);

设置了这个属性后,我们必须给每个 Item 设置唯一的 ID。

3、重写 getItemId

在 Adapter 类中重写该方法来给每个 Item 一个唯一的ID。

@Overridepublic long getItemId(int position){    return items.get(position).getId();
}

这样写完之后闪烁就不再发生了。

getId() 只是我的一个方法,如果您没有一个类似 id 的唯一值,则可以使用字符串上的 hashCode() 来获取唯一值。结果也是一样的。



  • 2020-12-08 17:13:57

    nvm卸载、安装node和npm

    1、node.js、nvm、 npm (1)在cmd中输入`where node`找到node长须所在位置进行删除 (2)确保计算机-环境变量删除相关引用 (3)在cmd中输入`node -v` ,得到以下结果,删除成功

  • 2020-12-08 17:23:36

    Window下完全卸载删除Nodejs

    1.从卸载程序卸载程序和功能。 2.重新启动(或者您可能会从任务管理器中杀死所有与节点相关的进程)。 3.寻找这些文件夹并删除它们(及其内容)(如果还有)。根据您安装的版本,UAC设置和CPU架构,这些可能或可能不存在:

  • 2020-12-09 08:48:45

    nodejs版本以及其对应的npm版本

    正在寻找某个大版本的最新版? Node.js 10.x Node.js 8.x Node.js 6.x Node.js 4.x Node.js 0.12.x Node.js 0.10.x 所有版本

  • 2020-12-12 17:27:54

    手把手教你 GitLab 的安装及使用

    GitLab:是一个基于Git实现的在线代码仓库托管软件,你可以用gitlab自己搭建一个类似于Github一样的系统,一般用于在企业、学校等内部网络搭建git私服。