ListView CheckBox 全选,单选

ListView CheckBox 全选,单选

最近做商城项目,在购物车模块有用到listView 和checkBox单选全选,所以在这里记录一下,和大家共勉。如果有不对的地方请多多指教 ,多多包含。话不多说上代码。

activity代码
/**
* @类说明 listView checkBox的单选 全选删除 适用于商城购物车模块
*
*/

public class SelectCheckBoxActivity extends Activity implements OnClickListener {

    // 编辑按钮
    private TextView txt_edit;

    // 删除按钮
    private TextView txt_delete;

    // 全选按钮
    private CheckBox select_all_check;

    private ListView mlistView;

    // 数据源
    static String str[] = { "data1", "data2", "data3", "data4",  
       "data5",data6", "data7", "data8", "data9", "data10",   
       "data11",  "data12","data13" };

    private List<Map> list;

    //适配器
    private SelectBoxAdapter mAdapter;

    // 存储选中的checkBox数量
    List<Map> checkList = new ArrayList<Map>();

    /**
     * 状态 : 是否编辑
     */
    private boolean isEdit = false;

    private LinearLayout delete_all_linear;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_select_check_box);
        initView();
        initdata();
        mAdapter = new SelectBoxAdapter(this, list);
        mlistView.setAdapter(mAdapter);
    }

    private void initView() {
        mlistView = (ListView) findViewById(R.id.listView);
        txt_edit = (TextView) findViewById(R.id.txt_edit);
        txt_delete = (TextView) findViewById(R.id.txt_delete);
        select_all_check = (CheckBox) findViewById(R.id.check_selectall);
        delete_all_linear = (LinearLayout) findViewById(R.id.delete_all_linear);

        txt_edit.setOnClickListener(this);
        select_all_check.setOnClickListener(this);
        txt_delete.setOnClickListener(this);
        mlistView.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View arg1,
                    int position, long arg3) {
                Map<String, String> item = list.get(position);
                if (mAdapter.getEditState()) {
                    // 不是编辑状态 可点击item 处理item的点击事件

                    return;
                } else {
                    // 取得ViewHolder对象,这样就省去了通过层层的findViewById去实例化我们需要的cb实例的步骤
                    ViewHolder holder = (ViewHolder) arg1.getTag();
                    holder.check_select.setFocusable(true);
                    // 改变CheckBox的状态
                    holder.check_select.toggle();
                    if (holder.check_select.isChecked()) {
                        /**
                         * 如果check_select == true 当前item 置为 true checkList里面
                         * 没有与当前选中的item相同的 就把当前选中item添加到checkList
                         */

                        item.put("flag", "true");
                        if (!checkList.contains(item)) {
                            checkList.add(item);
                        }
                    } else {
                        /**
                         * 如果check_select == false 当前item 置为 FALSE
                         * 并且从checklist里面删除
                         */
                        item.put("flag", "false");
                        checkList.remove(item);
                    }

                    // 根据选中的数量来控制全选按钮的状态
                    if (checkList.size() == list.size()) {
                        select_all_check.setChecked(true);
                    } else {
                        select_all_check.setChecked(false);
                    }

                }

            }
        });

    }

    // 初始化数据
    public void initdata() {
        list = new ArrayList<Map>();
        for (int i = 0; i < str.length; i++) {
            HashMap<String, String> map = new HashMap<String, String>();
            map.put("content", str[i]);
            map.put("flag", "false");
            list.add(map);
        }
    }

    /**
     * 控制编辑按钮的显示
     * 
     * @param edit
     */
    private void toggle(boolean edit) {
        if (edit) {
            txt_edit.setText("编辑");
            txt_delete.setVisibility(View.GONE);
            delete_all_linear.setVisibility(View.GONE);
        } else {
            txt_edit.setText("完成");
            delete_all_linear.setVisibility(View.VISIBLE);
            txt_delete.setVisibility(View.VISIBLE);

        }
        select_all_check.setChecked(false);
        mAdapter.setEditState(edit);
        mAdapter.notifyDataSetChanged();
        isEdit = !isEdit;
    }

    /**
     * 编辑状态切换
     */
    private void toggleStaus(View v) {
        if (isEdit) {
            restData();
            toggle(true);
        } else {
            restData();
            toggle(false);
        }
    }

    // 每次编辑完成重置checkbox状态
    private void restData() {
        for (int i = 0; i < list.size(); i++) {
            if (list.get(i).get("flag").equals("true")) {
                list.get(i).put("flag", "false");
                checkList.clear();
            }
        }
        mAdapter.notifyDataSetChanged();
    }

    @SuppressWarnings("unchecked")
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.txt_edit:// 切换编辑
            toggleStaus(v);
            break;
        case R.id.txt_delete:// 删除
            list.removeAll(checkList);
            checkList.clear();
            mAdapter.notifyDataSetChanged();

            break;
        case R.id.check_selectall:// 全选
            if (select_all_check.isChecked() == true) {

                for (int i = 0; i < list.size(); i++) {
                    list.get(i).put("flag", "true");
                }
                // 数量设为list的长度
                checkList.addAll(list);

                mAdapter.notifyDataSetChanged();
            } else {
                restData();
            }
            break;
        }

    }
}

适配器代码

public class SelectBoxAdapter extends BaseAdapter {
    private Activity mContext;
    private LayoutInflater inflater;
    private List<Map> mList;
    // 是否编辑完成
    private boolean isEditState = true;

    public SelectBoxAdapter(Activity context,List<Map> list) {
        this.mContext = context;
        this.mList = list;
        inflater = LayoutInflater.from(mContext);
    }

     /**
     * 切换 "编辑" "完成" 状态
     */
    public void setEditState(boolean editState) {
        this.isEditState = editState;
    }

    public boolean getEditState() {
        return isEditState;
    }


    @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(int position, View convertView, ViewGroup parent) {
        ViewHolder mHolder = null;
        Map item = mList.get(position);
        if(convertView == null){
            mHolder = new ViewHolder();
            convertView = inflater.inflate(R.layout.item_checkbox, null);
            mHolder.check_select = (CheckBox)convertView.findViewById(R.id.check_select);
            mHolder.txt_select = (TextView)convertView.findViewById(R.id.txt_select);
            convertView.setTag(mHolder);
        }else {
            mHolder = (ViewHolder)convertView.getTag();
        }

        mHolder.txt_select.setText(item.get("content").toString());
        mHolder.check_select.setChecked(item.get("flag").equals("true"));
        mHolder.check_select.setVisibility(isEditState ? View.GONE : View.VISIBLE);

        return convertView;
    }

    class ViewHolder{
         CheckBox check_select;
         TextView txt_select;
    }

}

代码其实挺简单的,在这里主要是想记录一下。完整的项目在我的qq群里面有,有想要源码的可以加我的技术群 174905615。大家一起交流学习,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值