RecyclerView的刷新闪烁问题,及刷新顺序

休息了两天了,无聊死了,准备写点东西记录下最近遇到的问题。
RecyclerView 单选
单选的问题其实很简单Item的实体类加个boolean值check字段就ok,当我们选中时就给他设置为true。单选的表现方式可以分为2种,1.直接使用CheckBox、2.使用两张图片来处理,我更倾向于使用图片,因为这样图片的大小更容易控制。我在开发中用到的就是图片处理的方式。
在更新时推荐使用notifyItemRangeChanged(int position,@Nullable Object payload),这种方式的处理主要用于处理Item图片闪烁的处理的,在这里我们主要是要对Item的View尽可能的少的去刷新。通过payload处理我们的选中状态和未选中状态

binding.rlItem.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View v) {
          if (currentIndex != -1 && currentIndex != position) {
                 notifyItemChanged(currentIndex, "unSelected");
          }
          notifyItemChanged(position, "selected");
       }
 });

通过上面的方法我们来通知我们的刷新类别是选中状态(selected)还是未选中状态(unSelected)。

  @Override
    public void onBindViewHolder(FundListVH holder, int position, List<Object> payloads) {
        if (payloads.size() > 0) {
            if ("selected".equals(payloads.get(0))) {
                if (currentIndex == position) {
                    holder.binding.imageCheckBox.setImageResource(R.drawable.checkbox_unselected_h);
                    currentIndex = -1;
                    mData.get(position).setCheck(false);
                } else {
                    holder.binding.imageCheckBox.setImageResource(R.drawable.checkbox_selected_circle_h);
                    currentIndex = position;
                    mData.get(position).setCheck(true);
                }
            } else if ("unSelected".equals(payloads.get(0))) {
                holder.binding.imageCheckBox.setImageResource(R.drawable.checkbox_unselected_h);
                mData.get(position).setCheck(false);
                currentIndex = -1;
            }
        } else {
            super.onBindViewHolder(holder, position, payloads);
        }
    }

这里的currentIndex=-1的处理是用于后面告诉我们的Activity或者Fragment我们选中的是哪一个Item的。这里我在开发中遇到了个问题就是在我设置未选中的时候设置了currentIndex=-1,但是在实际使用中遇到了bug,那就是会有重复选择的出现,有的时候即使是单个选中的状态,通过debug发现notifyItemChanged 不是顺序执行的,我代码上是先执行反选,再执行选中,而实际情况却会出现先选中,再反选,因为反选我设置了currentIndex=-1,造成了我在得到选中的Item的时候没拿到数据。
大家一定要小心notifyItemChanged不是顺序执行的
大家一定要小心notifyItemChanged不是顺序执行的
大家一定要小心notifyItemChanged不是顺序执行的
重要的事情说三遍,最近又看了下源码,还是没找到原因,但是找到了执行顺序,并不是根据代码的顺序执行的,是根据Item的position顺序执行的。
下面贴下完整的代码,github

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 专业考题类型管理运行工作负责人一般作业考题内容选项A选项B选项C选项D选项E选项F正确答案 变电单选GYSZ本规程...
    小白兔去钓鱼阅读 9,091评论 0 13
  • HTML标签解释大全 一、HTML标记 标签:!DOCTYPE 说明:指定了 HTML 文档遵循的文档类型定义(D...
    米塔塔阅读 3,408评论 1 41
  • Getting Started Burp Suite 是用于攻击web 应用程序的集成平台。它包含了许多工具,并为...
    Eva_chenx阅读 28,941评论 0 14
  • 1、窗体 1、常用属性 (1)Name属性:用来获取或设置窗体的名称,在应用程序中可通过Name属性来引用窗体。 ...
    Moment__格调阅读 4,623评论 0 11
  • 这篇文章估计会让一些人很不爽,心里承受能力差者,请谨慎阅读。读过之后感觉是在影射自己进而奋发图强的,我倍感荣幸。 ...
    samzhao2016阅读 782评论 0 4