ListView中使用checkbox实现单选、多选等


title: ListView中使用checkbox实现单选、多选等

有的鱼是永远都关不住的 因为他们属于天空 ——《大鱼海棠》

一、首先新建布局文件,实现一个item的布局




    

        

            

            

            

        
    

 

显示效果图如下。

ListView中使用checkbox实现单选、多选等_第1张图片

二、在页面布局文件中添加ListView控件。

    

三、新建ListViewAdapter实现BaseAdapter

package com.cover.xushun.cover;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.LinearLayout;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.HashMap;

/**
 * Created by xushun on 16/7/5.
 */
public class ListViewAdapter extends BaseAdapter {

    private Context context;
    private ArrayList beans;


    // 用来控制CheckBox的选中状况
    private static HashMap isSelected;


    class ViewHolder {
        TextView tvName;
        CheckBox cb;
        LinearLayout LL;
    }

    public ListViewAdapter(Context context, ArrayList beans,HashMap isSelected) {
        // TODO Auto-generated constructor stub
        this.beans = beans;
        this.context = context;
        this.isSelected = isSelected;
        // 初始化数据
        initDate();

    }

    // 初始化isSelected的数据
    private void initDate() {
        for (int i = 0; i < beans.size(); i++) {
            getIsSelected().put(i, false);
        }
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return beans.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return beans.get(position);
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        // 页面
        Log.v("MyListViewBase", "getView " + position + " " + convertView);
        ViewHolder holder = null;
        String bean = beans.get(position);
        LayoutInflater inflater = LayoutInflater.from(context);
        if (convertView == null) {
            convertView = inflater.inflate(
                    R.layout.assist_device_binding_list_item, null);
            holder = new ViewHolder();
            holder.cb = (CheckBox) convertView.findViewById(R.id.checkBox1);
            holder.tvName = (TextView) convertView.findViewById(R.id.tv_device_name);
            holder.LL = (LinearLayout) convertView.findViewById(R.id.linear_layout_up);
            convertView.setTag(holder);
        } else {
            // 取出holder
            holder = (ViewHolder) convertView.getTag();
        }
        System.out.println(isSelected.toString());
        holder.tvName.setText(bean);
        // 监听checkBox并根据原来的状态来设置新的状态
        holder.LL.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                System.out.println("点击:"+position);
                if (isSelected.get(position)) {
                    isSelected.put(position, false);
                    setIsSelected(isSelected);
                } else {
                    isSelected.put(position, true);
                    setIsSelected(isSelected);
                }
                notifyDataSetChanged();
            }
        });

        // 根据isSelected来设置checkbox的选中状况
        holder.cb.setChecked(getIsSelected().get(position));
        return convertView;
    }

    public static HashMap getIsSelected() {
        return isSelected;
    }

    public static void setIsSelected(HashMap isSelected) {
        ListViewAdapter.isSelected = isSelected;
    }
}

其中重要的是 ** HashMap isSelected 它记录了每个checkbox的选中状态,当checkbox的点击事件触发后,我们首先判断isSelected中记录的是选中还是未选中,然后来改变选中状态。再来设置checkbox的状态。当我们在使用增删列表项目的时候一定要记着改变isSelected的长度以及对应的状态。**

四、在acitivity中使用

        // TODO Auto-generated method stub
        listView = (ListView) findViewById(R.id.listView1);
        for (int i = 0; i < beans1.size(); i++) {
            System.out.println("beans1 " + i + "  :" + beans1.get(i));
        }
        isselected = new HashMap();

        adapter = new ListViewAdapter(DeleteCover.this, beans1,isselected);
        listView.setAdapter(adapter);
        listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
        delete_sureBtn = (Button) findViewById(R.id.delete_sureBtnIds);
        delete_sureBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (beans1.size() > 0) {
                    isselected = adapter.getIsSelected();
                    for (int i = 0; i < isselected.size(); i++) {
                        if (isselected.get(i).equals(true)) {

                            String coverid = coverArray.get(i).get("coverid").toString();
                            String[] params = new String[]{USER_NAME, coverid, TOKEN};
                            coverArray.remove(i);
                            beans1.remove(i);
                            isselected.put(i, false);
                            isselected.remove(isselected.size() - 1);
                            new deleteCoverTask().execute(params);
                        }
                    }
                    adapter.notifyDataSetChanged();

                }

            }
        });

在测试时候如果不增加删除item 后也对应删除isSelect中的数据,就会出现原本删除item后原来的位置的checkbox的状态变为之前的删除的那个的状态。所以这段代码很重要。

最终效果展示

Gif_20160711_110359.gif

最后留下个小问题,欢迎尝试。

在我们自定义的view中使用到了onClickListener来监听checkbox的点击事件,那么如果我们使用onCheckedChangeListener来做呢?会有什么需要注意的地方;另外,如果我们在点击listview的item时也来改变checkbox的状态时又该怎么处理

你可能感兴趣的:(ListView中使用checkbox实现单选、多选等)