关闭

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

标签: checkboxlistviewandroid
356人阅读 评论(0) 收藏 举报
分类:

主要是对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

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:27161次
    • 积分:813
    • 等级:
    • 排名:千里之外
    • 原创:53篇
    • 转载:2篇
    • 译文:0篇
    • 评论:3条