Recycleview ViewHolder复用出现item选中或其它状态混乱解决

前两个是其他大神提到很多的方法,不推荐使用。

方法一:
holder.setIsRecyclable(false);

暴力解决,使viewholder不进行复用,也不存在混乱选中的问题了,但是 滑动卡的要死。

方法二:

在JavaBean中设置一个变量,相当于一个标志位,但是需要修改bean 。虽然只是加个字段的问题,但是不建议。

方法三:

1.在Adapter中创建一个list记录选中的item的position,

private List checkIds = new ArrayList<>();

2.然后onBindViewHolder方法中,根据list中是否包含当前position来显示是否选中的状态

if (checkIds.contains(holder.getLayoutPosition()))
        expand.expand();// checkBox.setChecked(true);
    else
        expand.collapse();// checkBox.setChecked(false);

3.选中点击事件,选中则add到list,未选择则remove,注意这里添加和remove的是Integer对象,因为list.remove()方法既可以传对象,又可以传集合元素索引,这里不要混淆。

holder.itemView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

        if (expand.isExpanded()) {
            checkIds.remove(Integer.valueOf(holder.getLayoutPosition()));
        }else {
            checkIds.add(holder.getLayoutPosition());
        }


        L.show("position==" + holder.getPosition());
        expand.toggle();


    }
});
other:上面是多选方法,下面继续补充一种单选方法
Recycleview ViewHolder复用出现item选中或其它状态混乱解决_第1张图片
a.gif

1.在Adapter中创建一个int成员变量记录选中的item的position,和ItemView根布局实例对象。

private int checkId = -1;
private ExpandableLayout oldView;

2.然后onBindViewHolder方法中,根据记录的checkId显示是否选中的布局

  if (checkId == holder.getLayoutPosition())
    expand.expand(false);
 else
    expand.collapse(false);

3.item条目点击事件(主要)

holder.getView(R.id.mTranItemContent).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        if (oldView != null && checkId != holder.getLayoutPosition())// 判断上一次点击选中的View是不是自己
            oldView.collapse();// 将上一次选中的item取消掉
        expand.toggle(); // 切换当前item的状态
        if (expand.isExpanded()) {// 切换之后判断状态,如果是checked状态,就记录当前item信息
            checkId = holder.getLayoutPosition();
            oldView = expand;
        } else {
            checkId = -1;
            oldView = null;
        }
    }
});

你可能感兴趣的:(Recycleview ViewHolder复用出现item选中或其它状态混乱解决)