版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Luck_Nie/article/details/72026312
CheckBox实现多选、全选、反选功能
前不久项目中用到了多选列表功能,在这里讲述一下实现思路以及需要注意的地方, 不足之处,敬请谅解!
实现多选功能列表一般可以用ListView 或RecyclerView嵌套CheckBox实现,这里用的是ListView。
废话不多,先上图
先说一下多选实现思路
首先需要一个Map集合用于存储每一个条目的选中状态。选中哪个条目,则把该条目的位置添加进集合,并设置key为true,删除则设置Map集合中对应的位置的key为false。最后提交的时候,遍历map集合,即可得到所有选中的条目。
全选、反选功能实现思路比较简单
全选是把Map集合中的key全部设置为true即可,而反选则需要遍历Map集合,判断每个key的状态并设置为相反的状态。
下面直接上代码
XML布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/multi_btn_all"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="全选" />
<Button
android:id="@+id/multi_btn_opposite"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="反选" />
<Button
android:id="@+id/multi_btn_submit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="提交" />
</LinearLayout>
<ListView
android:id="@+id/multi_lv_listview"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView>
</LinearLayout>
MultiSelectActivity
创建集合存放数据
//用于存储条目数据
private List<String> list = new ArrayList<>();
//用户存储条目的选择状态
private Map<Integer, Boolean> isCheck = new HashMap<>();
//用于存放已选择的条目
private List<Integer> selectList = new ArrayList<>();
初始化数据
for (int i = 0; i < 100; i++) {
//给集合中设置50条数据
list.add("设置第" + i + "条数据");
//初始化所有条目为未选中状态
isCheck.put(i, false);
}
给条目设置数据
//设置数据
if (multiSelectAdapter == null) {
multiSelectAdapter = new MultiSelectAdapter(list, isCheck, MultiSelectActivity.this);
listView.setAdapter(multiSelectAdapter);
} else {
multiSelectAdapter.notifyDataSetChanged();
}
接下来看一下适配器 MultiSelectAdapter.class
首先通过构造函数设置数据
public Map<Integer,Boolean> isCheck ;
private List<String> list;
private Context context;
//通过构造函数获取数据
public MultiSelectAdapter(List<String> list,Map<Integer,Boolean> isCheck, Context context) {
this.list = list;
this.context = context;
this.isCheck = isCheck;
}
设置条目checkBox 的点击事件
viewHolder.mCheckBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isCheck.get(position)) {
//如果取消,则设置map集合中为false
viewHolder.mCheckBox.setChecked(false);
isCheck.put(position,false);
} else {
//如果选中,则设置map集合中为true
viewHolder.mCheckBox.setChecked(true);
isCheck.put(position,true);
}
}
});
注意!!!
注意!!!
注意!!!
在getView 方法返回view之前一定要给CheckBox设置中状态,否则在复用的时候会出现状态错乱
//给CheckBox设置状态
viewHolder.mCheckBox.setChecked(isCheck.get(position));
return convertView;
接下来看一下全选及反选功能的实现 MultiSelectActivity
全选功能实现
//全选
selectAll.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
for (int i = 0; i < list.size(); i++) {
//把集合中所有的选项设置为true,刷新布局
isCheck.put(i, true);
}
//刷新布局
initData();
}
});
反选功能实现
//反选
selectOpposite.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//遍历map集合,设置反选
for (int key : isCheck.keySet()) {
if(isCheck.get(key)){
isCheck.put(key,false);
}else{
isCheck.put(key,true);
}
}
//刷新布局
initData();
}
});
最后提交
//提交
submit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//清除之前选择的数据
selectList.clear();
//遍历map集合
for (int key : isCheck.keySet()) {
//判断是否已选择,如果已选择,则添加进selectList
if(isCheck.get(key)){
selectList.add(key);
}
}
Toast.makeText(MultiSelectActivity.this,selectList.toString(),Toast.LENGTH_SHORT).show();
}
});
以上就是简单实现多选列表,全选、反选功能的过程,仅供参考,如有错误之处,还请指正!