1. 概述
在开发过程中,如果 ListView 列表中含有 全选、反选、复选框CheckBox、删除这些需求时,对于选中CheckBox之后,然后删除数据,需要注意的是:删除数据不要在原始的 list集合 中删除数据,需要定义一个临时的 tempList集合,用于存储 选中的数据,然后在删除数据时直接 从 原始的 list集合中全部移除 tempList即可,这类需求一般用于 商城类项目中的购物车,购物车含有单选、全选、删除等问题。
比如下边自己项目中用到的:
2. 解决方案
1>:MainActivity 代码如下:
/**
* Email: [email protected]
* Created by Novate 2018/7/26 18:01
* Version 1.0
* Params:
* Description: ListView 中含有全选、反选、CheckBox、删除
*/
public class MainActivity extends AppCompatActivity {
private ListView lv;
private List list;
private MyBaseAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.lv);
// 对lv进行数据绑定
list = getLoadData();
adapter = new MyBaseAdapter(list);
lv.setAdapter(adapter);
}
/**
* 给listview填充所需要的数据
*/
public List getLoadData() {
List list = new ArrayList();
for (int i = 0; i < 10; i++) {
MapBean bean = new MapBean("Uname_" + i, false);
list.add(bean);
}
return list;
}
public void btnClick(View v) {
switch (v.getId()) {
case R.id.btn_cancel://取消按钮
for (int i = 0; i < list.size(); i++) {
list.get(i).setStatus(false);
}
//notifyDataSetChanged意思是不用刷新listview
adapter.notifyDataSetChanged();
break;
case R.id.btn_selectall://全选按钮
for (int i = 0; i < list.size(); i++) {
list.get(i).setStatus(true);
}
adapter.notifyDataSetChanged();
break;
case R.id.btn_reverse://反选按钮
for (int i = 0; i < list.size(); i++) {
boolean flag = list.get(i).getStatus();
if (flag) {
list.get(i).setStatus(false);
} else {
list.get(i).setStatus(true);
}
}
adapter.RefreashAdapter();
break;
case R.id.btn_delete: //删除按钮
// 定义临时集合,用于存储选中的数据
List templist = new ArrayList();
// 遍历原始数据集合,取出所有选中的数据,然后存储到临时集合templist中
for (int i = 0; i < list.size(); i++) {
if (list.get(i).getStatus()) {
templist.add(list.get(i));
}
}
// 遍历临时集合templist,如果该集合不为空,就说明需要删除的数据,这个时候,直接从原始集合中把临时集合templist全部移除即可
// 否则,就提示选择要删除的数据
if (templist != null && templist.size() > 0) {
list.removeAll(templist);
}else{
Toast.makeText(MainActivity.this , "请选择要删除的数据" , Toast.LENGTH_SHORT).show();
return;
}
adapter.notifyDataSetChanged();
break;
}
}
}
2>:adapter代码如下:
/**
* Email: [email protected]
* Created by Novate 2018/7/28 11:25
* Version 1.0
* Params:
* Description:
*/
public class MyBaseAdapter extends BaseAdapter {
private List mList;
public MyBaseAdapter(List list) {
this.mList = list;
}
@Override
public int getCount() {
return mList.size();
}
@Override
public Object getItem(int position) {
return mList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, null);
viewHolder = new ViewHolder();
viewHolder.item_tv = (TextView) convertView.findViewById(R.id.item_tv);
viewHolder.item_cb = (CheckBox) convertView.findViewById(R.id.item_cb);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
MapBean bean = mList.get(position);
viewHolder.item_tv.setText(bean.getName());
viewHolder.item_cb.setChecked(bean.getStatus());
// 对复选框做监听
viewHolder.item_cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// 是在修改list中的MapBean对象的状态
mList.get(position).setStatus(isChecked);
}
});
return convertView;
}
public void RefreashAdapter() {
notifyDataSetChanged();
}
private class ViewHolder {
TextView item_tv;
CheckBox item_cb;
}
}
代码已上传至github:
https://github.com/shuai999/ListViewCheckBox.git