ListView里的CheckBox选中后滑动时候选择错位的原因.

1 篇文章 0 订阅
1 篇文章 0 订阅

因为现在做的APP,属于OA员工管理类型的.所以肯定会包含批量选择.
在批量选择时,遇到了很多BUG.在这不得不承认小白就是小白.很简单的问题,就是差自己记录下来了.
尤其是选中后滑动,checkBox会改变postion
很尴尬-.-

  public Map<Integer, Boolean> map = new LinkedHashMap<>();
    private boolean isShowCheckBox;
    public Map<Integer, String> selectMap = new LinkedHashMap<>();
    public Map<Integer, Integer> contrastMap = new LinkedHashMap<>();

    public boolean isShowCheckBox() {
        return isShowCheckBox;
    }

    public void setIsShowCheckBox(boolean isShowCheckBox) {
        this.isShowCheckBox = isShowCheckBox;
    }

/**这些Map都是用来储存状态或者位置的.
要通过这些判断是否往那个选中的List里添加数据
下面才重点
**/

check.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            //重写check选择或取消更改时的监听

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                map.put(holder.getPosition(), isChecked);
                /**用一个map来记录Item在Listview里的位置,以及选择状态 
            public Map<Integer, Boolean> map = new LinkedHashMap<>();
              private boolean isShowCheckBox;**/


                if (!contrastMap.containsKey(u.getUserID())) {
                    contrastMap.put( u.getUserID(),holder.getPosition());
                }
                if (contrastMap.get(u.getUserID()) == holder.getPosition())
                    if (isChecked) {
                        selectMap.put(u.getUserID(), u.getTrueName());
                    } else {
                        if (selectMap.containsKey(u.getUserID())) {
                            selectMap.remove(u.getUserID());
                        }
                    }//上面这2个if就不说了,就是循环检查是否选中的
                    //至于getUserID,getTrueName就是实体类里的get,set.大家自行调整.
                    //holder.getPosition();是基类里的复用ContView时候的Holder,获取的位置.
            }
        });

/**重点是这
         * 一定要把选中的状态设置放在监听方法下面.
         * Listview是复用的.conteView就那几个,只是更换显示内容.
         * 如果先设置状态,在走监听.
         * 那么当顶上那个Item滑出屏幕,重新复用到屏幕最下方的时候,就会把已选中的第一Item的 isShowCheckBox的状态更改.
         *
         * **/
        if (isShowCheckBox) {
            check.setVisibility(View.VISIBLE);
        } else {
            check.setVisibility(View.GONE);
        }
        if (map.containsKey(holder.getPosition())) {
            check.setChecked(map.get(holder.getPosition()));
        } else {
            check.setChecked(false);
        }

本来之前就写好了已经再用了,可是还是会偶尔出错!
因为我就是把设置状态和监听颠倒了.
所以才会注释那么多.就是想给解决的朋友们一个提醒.
这个方法网上也有解决,就是看了网上才知道自己错的多么可笑.

一语惊醒梦中人!
具体可以去参考:http://www.jb51.net/article/33424.htm

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值