Android ListView在有checkbox的情况下上下滑动选中状态错误以及position错乱

在处理有checkbox的ListViewd的时候,如果我们选中了上面几个checkbox,下拉到后面,一些在下面的checkbox也会出现选中的状态,这是由于checkbox控件复用的缘故,解决这个问题有以下方式:

1、在数据源对象中设置一个boolean变量记录checkbox是否选中,然后在getView中添加以下代码:

        cb.setChecked(bean.isCheck());
        cb.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                bean.setIsCheck(cb.isChecked());
            }
        });

2、在adapter中新建一个列表存储点击情况,然后根据存储的情况设置checkbox的点击:

    private List<Integer> mPostions = new ArrayList<>();

在getView中添加以下代码:

        cb.setChecked(false);
        if (mPostions.contains(viewHolder.getPosition())) {
            cb.setChecked(true);
        }
        cb.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (cb.isChecked()) {
                    mPostions.add(viewHolder.getPosition());
                } else {
                    mPostions.remove((Integer) viewHolder.getPosition());
                }
            }
        });
以上代码基于共同适配器,没有共同适配器的情况,请用getView里面的参量position代替viewHolder.getPosition()


第一种方式比较简洁,如果不能添加对象变量的情况下使用第二种


在使用ListView删除的时候,也碰到pos错乱的问题,直接导致了删除的时候数组出界了。

    @OnItemLongClick(R.id.list_allreserves)
    public boolean deleteReserve(final int position) {
        isMenuMode = true;
        // viewstub还没有加载
        if (mMenu == null) {
            ((ViewStub) findViewById(R.id.stub_menu)).inflate();
            mMenu = findViewById(R.id.flyt_menu);
            mMenu.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    hideMenu();
                }
            });
            ((TextView) findViewById(R.id.tv_menu_delete)).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // 移除预约
                    mDatas.remove(position);
                    refreshList();
                    hideMenu();
                }
            });
        }
        mMenu.setVisibility(View.VISIBLE);
        return true;
    }


以上是错误代码,产生问题的关键是,传入的position是正确的,但是到达onClick里面的时候,position就和外面的传参不一样了,查不出来原因,现在的解决办法是,设置一个全局变量在外面,记录一下传入函数的position,在onClick里面使用全局变量。

    @OnItemLongClick(R.id.list_allreserves)
    public boolean deleteReserve(int position) {
        // 是否本人操作检查 TODO
        isMenuMode = true;
        currentPosition = position;
        // viewstub还没有加载
        if (mMenu == null) {
            ((ViewStub) findViewById(R.id.stub_menu)).inflate();
            mMenu = findViewById(R.id.flyt_menu);
            mMenu.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    hideMenu();
                }
            });
            ((TextView) findViewById(R.id.tv_menu_delete)).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // 移除预约
                    if (currentPosition != -1) {
                        mDatas.remove(currentPosition);
                        currentPosition = -1;
                    }
                    refreshList();
                    hideMenu();
                }
            });
        }
        mMenu.setVisibility(View.VISIBLE);
        return true;
    }




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值