美文网首页
RecyclerView的刷新闪烁问题,及刷新顺序

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

作者: 王忠辉 | 来源:发表于2019-10-23 17:40 被阅读0次

休息了两天了,无聊死了,准备写点东西记录下最近遇到的问题。
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

相关文章

网友评论

      本文标题:RecyclerView的刷新闪烁问题,及刷新顺序

      本文链接:https://www.haomeiwen.com/subject/tmikvctx.html