ListView的全选、复选框、删除相关问题

1. 概述

在开发过程中,如果 ListView 列表中含有 全选、反选、复选框CheckBox、删除这些需求时,对于选中CheckBox之后,然后删除数据,需要注意的是:删除数据不要在原始的 list集合 中删除数据,需要定义一个临时的 tempList集合,用于存储 选中的数据,然后在删除数据时直接 从 原始的 list集合中全部移除 tempList即可,这类需求一般用于 商城类项目中的购物车,购物车含有单选、全选、删除等问题。

比如下边自己项目中用到的:


图片.png
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

你可能感兴趣的:(ListView的全选、复选框、删除相关问题)