Recycleview checkbox 复用出现混乱解决方法

今天在做项目的一个我的收藏页面时要实现这么一个效果:

每个item 前面都有一个checkbox ,主要布局是recycleview 。当我们选中某项时,继续往下滑动下面某个的checkbox也会变成选中状态。

解决方法一比较暴力 viewHolder.setIsRecyclable(false);

这样viewholder就不进行复用,也不存在checkbox 混乱选中的问题了,但是 你滑动的时候卡的要死。

第二种就是在获取到的bean中设置一个标志位,但是需要修改bean 。虽然只是加个字段的问题,但是不建议。

第三种就是用个辅助list记录选中的item. 这还不够,还要配合viewholder的settag().

1.在绑定view的时候

viewHolder.checkBox.setTag(new Integer(position));//设置tag 否则划回来时选中消失

    if (checkPositionlist != null) {
        ((MyViewHolder) holder).checkBox.setChecked((checkPositionlist.contains(new Integer(position)) ? true : false));
    } else {
        ((MyViewHolder) holder).checkBox.setChecked(false);
    }

2.选中监听事件:

 viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                MyCollectionBaseBean baseBean = data.getFavoritesList().get(position);

                if (isChecked) {
                    //Log.e("fangchao 1", viewHolder.checkBox.getTag() + "");
                    if (!checkPositionlist.contains(viewHolder.checkBox.getTag())) {//这句要有 ,否则不复用了,但是你再滑动回去的时候,都成了为选中。这是因为你的item滑出可视范围时,就会触发oncheckchange事件,所以用第一步绑定的tag进行二次判断。防止选中的丢失
                        checkeddata.add(baseBean);
                        checkPositionlist.add(new Integer(position));
                    }
                } else {
                    //Log.e("fangchao 2", viewHolder.checkBox.getTag() + "");
                    if (checkPositionlist.contains(viewHolder.checkBox.getTag()))//这句同上,二次判断{
                        checkeddata.remove(baseBean);
                        checkPositionlist.remove(new Integer(position));
                    }
                }
            }
        });

完整代码,自己摘着看:


/**
 * Created By Fangchao On 2015/3/5
 */
public class CollectionAdapter extends FooterAdapter {
    private MyCollectionListBean data;// 元数据
    private List<MyCollectionBaseBean> checkeddata = new ArrayList<>();// 选中的数据
    private ImageLoader mImageLoader;
    private List<Integer> checkPositionlist;

    public CollectionAdapter(MyCollectionListBean data) {
        this.data = data;
        mImageLoader = new ImageLoader(MyApplication.getInstance()
                .getRequestQueue(), BitmapCache.getInstance());
        checkPositionlist = new ArrayList<>();
    }

    public class MyViewHolder extends RecyclerView.ViewHolder {
        public TextView txt_onsale, txt_mj, txt_present, goodsname, goods_describe;
        public TextView price, mark_price, commentsnums;
        CheckBox checkBox;
        NetworkImageView goods_img;
        public View v;

        public MyViewHolder(View v) {
            super(v);
            this.v = v;
            txt_onsale = (TextView) v.findViewById(R.id.txt_onsale);
            txt_mj = (TextView) v.findViewById(R.id.txt_mj);
            txt_present = (TextView) v.findViewById(R.id.txt_present);
            goods_describe = (TextView) v.findViewById(R.id.tv_production_describ);
            goodsname = (TextView) v.findViewById(R.id.tv_goods_name);
            price = (TextView) v.findViewById(R.id.tv_goods_price);
            mark_price = (TextView) v.findViewById(R.id.tv_goods_markprice);
            commentsnums = (TextView) v.findViewById(R.id.tv_goods_commentsnums);
            checkBox = (CheckBox) v.findViewById(R.id.collection_cb);
            goods_img = (NetworkImageView) v.findViewById(R.id.mycollection_item_image);

        }

    }

    @Override
    public boolean useFooter() {
        return true;
    }

    @Override
    public RecyclerView.ViewHolder onCreateContentItemViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item_collection, parent, false);

        MyViewHolder vh = new MyViewHolder(v);
        return vh;
    }

    @Override
    public void onBindContentItemView(RecyclerView.ViewHolder holder, final int position) {
        MyViewHolder viewHolder = (MyViewHolder) holder;
        // viewHolder.setIsRecyclable(false);
        viewHolder.goodsname.setText(data.getFavoritesList().get(position).getGoods().getGoodsName());
        if (StringUtils.isBlank(data.getFavoritesList().get(position).getGoods().getGoodsSlogan())) {
            viewHolder.goods_describe.setVisibility(View.GONE);
        } else {
            viewHolder.goods_describe.setVisibility(View.VISIBLE);
            viewHolder.goods_describe.setText(data.getFavoritesList().get(position).getGoods().getGoodsSlogan());
        }
        viewHolder.price.setText(PriceTools.formatStr(data.getFavoritesList().get(position).getGoods().getShopPrice()));
        viewHolder.price.setTextColor(Color.parseColor("#E5004B"));
        viewHolder.mark_price.setText(PriceTools.formatStr(data.getFavoritesList().get(position).getGoods().getMarketPrice()));
        viewHolder.mark_price.setBackgroundResource(0);
        viewHolder.mark_price.getPaint().setFlags(
                Paint.STRIKE_THRU_TEXT_FLAG | Paint.ANTI_ALIAS_FLAG); // 设置中划线并加清晰
        viewHolder.commentsnums.setText(data.getFavoritesList().get(position).getGoods().getCommentCount());
        viewHolder.checkBox.setTag(new Integer(position));//设置tag 否则划回来时选中消失
        //checkbox  复用问题
        if (checkPositionlist != null) {
            ((MyViewHolder) holder).checkBox.setChecked((checkPositionlist.contains(new Integer(position)) ? true : false));
        } else {
            ((MyViewHolder) holder).checkBox.setChecked(false);
        }
        //Log.e("ffff",position+"");
        viewHolder.goods_img.setDefaultImageResId(R.drawable.item_default_img);
        viewHolder.goods_img.setErrorImageResId(R.drawable.item_default_img_err);
        viewHolder.goods_img.setImageUrl(data.getFavoritesList().get(position).getGoods().getImgFile(), mImageLoader);
        if (data.getFavoritesList().get(position).getGoods().getIsOnSale().equals("false")) {
            //下架
            viewHolder.price.setText("本商品已经下架");
            viewHolder.price.setTextColor(Color.GRAY);
            viewHolder.mark_price.setText("");
        } else if (data.getFavoritesList().get(position).getGoods().isIsNoStock()) {
            //缺货
            viewHolder.mark_price.setBackgroundResource(R.drawable.ticket_is_outof_date_bg);
            viewHolder.mark_price.setText(" 缺货 ");
            viewHolder.price.setTextColor(Color.GRAY);
            viewHolder.mark_price.getPaint().setFlags(0);
        }
        //cb 的选中事件
        onchecked(viewHolder, position);

    }

    private void onchecked(final MyViewHolder viewHolder, final int position) {

        viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                MyCollectionBaseBean baseBean = data.getFavoritesList().get(position);

                if (isChecked) {
                    //Log.e("fcccc 1", viewHolder.checkBox.getTag() + "");
                    if (!checkPositionlist.contains(viewHolder.checkBox.getTag())) {
                        checkeddata.add(baseBean);
                        checkPositionlist.add(new Integer(position));
                    }
                } else {
                    //Log.e("fcccc 2", viewHolder.checkBox.getTag() + "");
                    if (checkPositionlist.contains(viewHolder.checkBox.getTag())) {
                        checkeddata.remove(baseBean);
                        checkPositionlist.remove(new Integer(position));
                    }
                }
            }
        });
    }

    @Override
    public int getContentItemCount() {
        if (data != null)
            return data.getFavoritesList().size();
        else return 0;
    }

    @Override
    public int getContentItemType(int position) {
        return 0;
    }

    public void getdata(MycheckListener listener) {
        listener.getcheckeddata(checkeddata);
    }

    public interface MycheckListener {
        void getcheckeddata(List<MyCollectionBaseBean> listBean);
    }
}
时间: 2024-07-31 19:33:28

Recycleview checkbox 复用出现混乱解决方法的相关文章

session 之session混乱解决方法(转)

知道了session混乱产生的原因之后,也就知道了问题的根源.同时也引出了很多的问题: 1.如何记录住在线人员(这里只有帐号的系统用户,不包括访客): 2.如何限制同一个帐号在同一时间段内只能够登陆一次系统? 3.如何限制不同的用户在同一台机器上登陆系统? 4.管理员如何踢人? 我们首先来分析上面的问题: 首先在服务器端当用户通过身份验证成功登陆系统之后,我们将此用户的信息记录住(OnLineUserManager.java),包括帐号.登陆日期.机器的IP地址.session的ID,sessi

post 之checkbox 未被选中解决方法

第一种方法: http://cnn237111.blog.51cto.com/2359144/1293812 第二种方法(推荐): http://blog.csdn.net/xyanghomepage/article/details/37562179 <input type="hidden" name="foo" value="0"> <input type="checkbox" name="foo

foobar2000专辑封面混乱解决方法

foobar2000的专辑封面缓存是调用windows media player的 解决方案: 1.打开windows media player 2.标题栏点击右键,选择工具-高级-还原媒体库,wmp关闭后重新打开会看到所有音乐都被重新添加进了音乐库,再看看,封面是不是都正常了! 来自为知笔记(Wiz)

关于cell中添加子视图 复用重叠问题的解决方法

问题本质: 因为你要添加的子视图并不是在自定义的cell中实现的,而是根据系统给的UITableViewCell这个类创建的实例,每次进图 cellForRow方法都会创建一个cell,每次都要创建一个子视图添(button,label之类的)加进去,会给占用很大的内存,所以采用了复 用的方法,但是问题就来了,当cell超出界面,从队列中拿过来复用的时候,其中子视图的内容并没有消除,这样你会原来的基础上再创建一个子视图添加上去 遮住了原来的视图,一般视图都是透明的这样的话就变成了一层层的叠加.

asp.net MVC中使用Html.Checkbox提示该字符串未被识别为有效的布尔值错误的解决方法

在asp.net MVC中使用Html.CheckBox提交后出现该字符串未被识别为有效的布尔值错误,或从类型“System.String”到类型“System.Boolean”的参数转换失败. 错误例子:@Html.CheckBox("UserID",item.IsTrue,new{value=item.UserID}) 这是由于MVC会在页面上生成<input id="UserID" name="UserID" value="

jquery-easyui的datagrid在checkbox多选时,行选中不对应,去除高亮的解决方法

jquery-easyui的datagrid在checkbox多选时,行选中不对应,去除高亮的解决方法 工作中用到一个具有多选功能的easyui-datagrid在处理cell的点击事件时,不允许被选中行的需求. 如下图,点击"查看"时,只是为了查看详细信息,并不是需要选择行. 完成这个需求,其实只需要将datagrid的checkOnSelect属性设置为false就可以了. 然而,当设置该属性后,新的问题就随之出现了. 目前的办法是使用以下代码去除高亮:  (本来是打算处理成c

关于UITableView复用问题的3种解决方法

最近在好多地方又遇到有人提tableview的复用问题,觉得还是说下自己的理解,希望能有帮助! 之前就想写自己关于复用的想法,拖了这么久,又有人被困惑,所以就写了. 事实上复用问题的本质是cell上面的控件的内容指针没有重指向.button事件重复添加等! 比如:指针重指向:cell.textLabel.text = model.name;这个就是label上内容的指针重指向,所以只要model有东西,就不会出现问题: 解决方法1:model标记: (1) 从复用队列取出cell: Invesm

WPF拖动DataGrid滚动条时内容混乱的解决方法

WPF拖动DataGrid滚动条时内容混乱的解决方法 在WPF中,如果DataGrid里使用了模板列,当拖动滚动条时,往往会出现列表内容显示混乱的情况.解决方法就是在Binding的时候给UpdateSourceTrigger赋值. <Grid> <Grid.RowDefinitions> <RowDefinition Height="25"></RowDefinition> <RowDefinition></RowDe

jquery中checkbox全选失效的解决方法

这篇文章主要介绍了jquery中checkbox全选失效的解决方法,需要的朋友可以参考下 如果你使用jQuery 1.6 ,代码if ( $(elem).attr(“checked”) ),将获得一个属性(attribute) ,它不改变该复选框被选中和选中.它只是用来存储默认或选中属性的初始值.为了保持向后兼容,.attr() 方法从 jQuery 1.6.1+ 开始除了返回属性值外,还会更新 property 属性,因此 boolean attribute(布尔属性)不需要通过 .prop(