美文网首页小技巧
Recycleview ViewHolder复用出现item选中

Recycleview ViewHolder复用出现item选中

作者: Endeav0r | 来源:发表于2018-01-03 14:34 被阅读324次

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

    方法一:
    holder.setIsRecyclable(false);
    

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

    方法二:

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

    方法三:

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

    private List<Integer> 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:上面是多选方法,下面继续补充一种单选方法
    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选中

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