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