带checkbox的listview,全选、删除、增加单条功能

原创 2016年05月31日 11:17:38

主要是对listview数据的操作,项目中用到的,改了改,有用的拿走。

效果如图

/* 这是ListView的Adapter,主要是checkbox部分的逻辑**/

public class DemoAdapter extends BaseAdapter {

    /**
     * 上下文对象
     */
    private Context context = null;

    /**
     * 数据集合
     */
    private List<DemoBean> datas = null;

    /**
     * CheckBox 是否选择的存储集合,key 是 position , value 是该position是否选中
     */
    private Map<Integer, Boolean> isCheckMap = new HashMap<Integer, Boolean>();

    public DemoAdapter(Context context, List<DemoBean> datas) {
        this.datas = datas;
        this.context = context;

        // 初始化,默认都没有选中
        configCheckMap(false);
    }

    /**
     * 首先,默认情况下,所有项目都是没有选中的.这里进行初始化
     */
    public void configCheckMap(boolean bool) {

        for (int i = 0; i < datas.size(); i++) {
            isCheckMap.put(i, bool);
        }

    }

    @Override
    public int getCount() {
        return datas == null ? 0 : datas.size();
    }

    @Override
    public Object getItem(int position) {
        return datas.get(position);
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;

        if (convertView == null) {
            holder = new ViewHolder();
            convertView = View.inflate(context, R.layout.listview_item_layout, null);
            holder.dong = (TextView) convertView.findViewById(R.id.tv_dong);
            holder.num = (TextView) convertView.findViewById(R.id.tv_num);
            holder.bei = (TextView) convertView.findViewById(R.id.tv_bei);
            holder.gao = (TextView) convertView.findViewById(R.id.tv_gao);

            holder.cbCheck = (CheckBox) convertView.findViewById(R.id.cbCheckBox);

            convertView.setTag(holder);

        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        DemoBean bean = datas.get(position);

        /*
         * 获得该item 是否允许删除
         */
        boolean canRemove = bean.isCanRemove();

        /*
         * 设置每一个item的文本
         */
        holder.num.setText(bean.num);
        holder.dong.setText(bean.dong);
        holder.bei.setText(bean.bei);
        holder.gao.setText(bean.gao);

        /*
         * 获得单选按钮
         */

        /*
         * 设置单选按钮的选中
         */
        holder.cbCheck.setOnCheckedChangeListener(new OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                /*
                 * 将选择项加载到map里面寄存
                 */
                isCheckMap.put(position, isChecked);
            }
        });

        if (!canRemove) {
            // 隐藏单选按钮,因为是不可删除的
            holder.cbCheck.setVisibility(View.GONE);
            holder.cbCheck.setChecked(false);
        } else {
            holder.cbCheck.setVisibility(View.VISIBLE);

            if (isCheckMap.get(position) == null) {
                isCheckMap.put(position, false);
            }

            holder.cbCheck.setChecked(isCheckMap.get(position));

            /**
             * 将数据保存到tag
             */
        }

        return convertView;
    }

    public static class ViewHolder {

        public TextView num;
        public TextView dong;
        public TextView bei;
        public TextView gao;
        public CheckBox cbCheck;
        public Object data;

    }

    /**
     * 增加一项的时候
     */
    public void add(DemoBean bean) {
        this.datas.add(0, bean);

        // 让所有项目都为不选择
        configCheckMap(false);
    }

    // 移除一个项目的时候
    public void remove(int position) {
        this.datas.remove(position);
    }

    public Map<Integer, Boolean> getCheckMap() {
        return this.isCheckMap;
    }

    public List<DemoBean> getDatas() {
        return datas;
    }

}
  • 非常简单的bean对象
public class DemoBean {

    public String num;
    public String dong;
    public String bei;
    public String gao;

    /**
     * 标识是否可以删除
     */
    private boolean canRemove = true;

    public boolean isCanRemove() {
        return canRemove;
    }

    public void setCanRemove(boolean canRemove) {
        this.canRemove = canRemove;
    }

    public DemoBean() {
    }

}
  • 最后就是应用了
public class MainActivity extends Activity implements OnClickListener, OnItemClickListener {

    /**
     * 返回按钮
     */
    private ViewGroup btnCancle = null;

    /**
     * 确定按钮
     */
    private ViewGroup btnAdd = null;

    /**
     * 选择所有
     */
    private Button btnSelectAll = null;

    /**
     * 清除所有
     */
    private Button btnDelete = null;

    /**
     * ListView列表
     */
    private ListView lvListView = null;

    /**
     * 适配对象
     */
    private DemoAdapter adpAdapter = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 初始化视图
        initView();

        // 初始化控件
        initData();

    }

    /**
     * 初始化控件
     */
    private void initView() {

        btnCancle = (ViewGroup) findViewById(R.id.btnCancle);
        btnCancle.setOnClickListener(this);

        btnAdd = (ViewGroup) findViewById(R.id.btnAdd);
        btnAdd.setOnClickListener(this);

        btnDelete = (Button) findViewById(R.id.btnDelete);
        btnDelete.setOnClickListener(this);

        btnSelectAll = (Button) findViewById(R.id.btnSelectAll);
        btnSelectAll.setOnClickListener(this);

        lvListView = (ListView) findViewById(R.id.lvListView);
        lvListView.setOnItemClickListener(this);

    }

    /**
     * 初始化视图
     */
    private void initData() {

        // 模拟假数据
        List<DemoBean> demoDatas = new ArrayList<DemoBean>();
        DemoBean bean = new DemoBean();
        bean.num = "123gh";
        bean.dong = "1234";
        bean.gao = "1235";
        bean.bei = "1236";
        demoDatas.add(bean);
        demoDatas.add(bean);
        demoDatas.add(bean);
        demoDatas.add(bean);

        adpAdapter = new DemoAdapter(this, demoDatas);

        lvListView.setAdapter(adpAdapter);

    }

    /**
     * 按钮点击事件
     */
    @Override
    public void onClick(View v) {

        /*
         * 当点击返回的时候
         */
        if (v == btnCancle) {
            finish();

        }

        /*
         * 当点击增加的时候
         */
        if (v == btnAdd) {

            DemoBean bean = new DemoBean();
            bean.num = "123gh";
            bean.dong = "1234";
            bean.gao = "1235";
            bean.bei = "1236";

            adpAdapter.add(bean);

            adpAdapter.notifyDataSetChanged();
        }

        /*
         * 当点击删除的时候
         */
        if (v == btnDelete) {

            /*
             * 删除算法最复杂,拿到checkBox选择寄存map
             */
            Map<Integer, Boolean> map = adpAdapter.getCheckMap();

            // 获取当前的数据数量
            int count = adpAdapter.getCount();

            // 进行遍历
            for (int i = 0; i < count; i++) {

                // 因为List的特性,删除了2个item,则3变成2,所以这里要进行这样的换算,才能拿到删除后真正的position
                int position = i - (count - adpAdapter.getCount());

                if (map.get(i) != null && map.get(i)) {

                    DemoBean bean = (DemoBean) adpAdapter.getItem(position);

                    if (bean.isCanRemove()) {
                        adpAdapter.getCheckMap().remove(i);
                        adpAdapter.remove(position);
                    } else {
                        map.put(position, false);
                    }

                }
            }

            adpAdapter.notifyDataSetChanged();

        }

        /*
         * 当点击全选的时候
         */
        if (v == btnSelectAll) {

            if (btnSelectAll.getText().toString().trim().equals("全选")) {

                // 所有项目全部选中
                adpAdapter.configCheckMap(true);

                adpAdapter.notifyDataSetChanged();

                btnSelectAll.setText("全不选");
            } else {

                // 所有项目全部不选中
                adpAdapter.configCheckMap(false);

                adpAdapter.notifyDataSetChanged();

                btnSelectAll.setText("全选");
            }

        }
    }

    /**
     * 当ListView 子项点击的时候
     */
    @Override
    public void onItemClick(AdapterView<?> listView, View itemLayout, int position, long id) {

        if (itemLayout.getTag() instanceof ViewHolder) {

            ViewHolder holder = (ViewHolder) itemLayout.getTag();

            // 会自动出发CheckBox的checked事件
            holder.cbCheck.toggle();

        }

    }
}

最后附上源码:http://download.csdn.net/detail/qq_30124547/9536241

ListView的ItemCheck和ItemChecked事件

ItemCheck:指示某项的选中状态将要更改,直到事件发生后,该值才会更新。 ItemChecked:当ListView的Checked属性更改时引发的事件。 两个事件都是由ListVi...
  • codeeer
  • codeeer
  • 2011年08月30日 12:25
  • 8865

给Button添加边框

GradientDrawable drawable = new GradientDrawable(); drawable.setShape(GradientDrawable.RECTANGLE);...

listview带checkbox全选、取消功能

  • 2017年01月09日 16:44
  • 42.55MB
  • 下载

Android 带checkbox的listView 实现多选,全选,反选,删除

activity_main.xml "http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.a...
  • LM_ZP
  • LM_ZP
  • 2016年05月12日 09:30
  • 2006

基于ListView和CheckBox实现多选和全选记录的功能

应用开发中经常会有从数据库中读取数据显示,然后选中多条、全部记录并且删除的需求。在做定制系统联系人的时候也遇到这样的需求,下面写个简单的通过ListView和CheckBox实现多选、全选的例子。下面...

基于ListView和CheckBox实现多选和全选记录的功能

http://blog.csdn.net/zuolongsnail/article/details/7051620 应用开发中经常会有从数据库中读取数据显示,然后选中多条、全部记录并...
  • daditao
  • daditao
  • 2014年05月15日 21:30
  • 2570

如何实现listView中checkbox的全选与反选功能

首先我们在实体类里封装一个属性:boolean checked 用来记录checkbox的选中状态 private String money; private String title; pri...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:带checkbox的listview,全选、删除、增加单条功能
举报原因:
原因补充:

(最多只允许输入30个字)