checkbox是我们开发中经常用到的选择控件
- 通过selector可以自定义checkbox选择样式
- 通过isChecked()方法,可以获取选中状态
- 通过setOnCheckedChangeListener监听选中改变状态
- setCheck(true/false)设置选中状态
- 可以setOnClickListener设置点击事件
说一下经常遇到的坑
- 焦点抢占事件
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;
}