Android CheckBox使用所遇到的坑

checkbox是我们开发中经常用到的选择控件

  1. 通过selector可以自定义checkbox选择样式
  2. 通过isChecked()方法,可以获取选中状态
  3. 通过setOnCheckedChangeListener监听选中改变状态
  4. setCheck(true/false)设置选中状态
  5. 可以setOnClickListener设置点击事件

说一下经常遇到的坑

  1. 焦点抢占事件

checkbox通常和listview一块使用的时候,item布局中使用checkbox,cb会抢占listview的item点击事件,解决方法:
给checkbox设置 android:focusable=”false”
在最外层父布局设置 android:descendantFocusability=”blocksDescendants”


2. setOnCheckedChangeListener()和setCheck()共同使用冲突问题

如果你代码中有根据数据设置checkbox选中状态,又同时监听了setOnCheckedChangeListener()方法,setChecked()时会触发此listener。
会造成页面checkbox选择错乱问题。
如果有setChecked()方法,此时,用setOnClickListener代替setOnCheckedChangeListener方法。

   if (bean.isCheck()) {
           cb.setChecked(true);
        } else {
            cb.setChecked(false);

        }

        cb.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                cb.isChecked();//获取选中状态
            }
        });

3. 结合listView多选使用
很多时候会结合列表多选使用checkbox,我们可以在列表数据对象中,自定义一个 ischeck字段,初始化为false,非选中状态,如果默认选中,同理初始化为true。
当我们点击checkbox改变状态时,手动调用改变ischeck字段值,最后通过遍历数据集合,判断ischeck字段来获取选中的条目。

class ItemBean{
  private boolean isCheck;//选中状态
  }


//监听checkbox改变状态
       cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {

                if (b) {
                    ItemBean.setCheck(true);
                } else {
                    ItemBean.setCheck(false);
                }
            }
        });

//最后筛选选中条目
List<Item> list;//初始时候所有值,遍历此集合

 public List<ItemBean> getList() {
        List<ItemBean>datas = new ArrayList<>();//创建新集合,用来存放选中的值
        for (int i = 0; i < list.size(); i++) {
            if (list.get(i).isCheck()) {
                datas.add(as.get(i));
            }
        }
        LogUtil.e("+++++++++++++++选中项" + datas.size(), "");
        return datas;
    }

猜你喜欢

转载自blog.csdn.net/zane_xiao/article/details/79044951