安卓checkbox全选/反选/取消选择

来源:互联网 发布:linux内核完全剖析 编辑:程序博客网 时间:2024/06/06 00:40

activity_main.xml文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"      android:layout_width="fill_parent"      android:layout_height="fill_parent"      android:orientation="horizontal" >      <TextView          android:id="@+id/tv"          android:layout_width="fill_parent"          android:layout_height="wrap_content"          android:layout_gravity="center_vertical" />      <LinearLayout          android:id="@+id/line"          android:layout_width="fill_parent"          android:layout_height="50dp"          android:layout_below="@+id/tv"          android:orientation="horizontal" >          <Button              android:id="@+id/bt_selectall"              android:layout_width="80dp"              android:layout_height="fill_parent"              android:text="全选" />               <Button              android:id="@+id/bt_cancleselectall"              android:layout_width="80dp"              android:layout_height="fill_parent"              android:text="反选" />          <Button              android:id="@+id/bt_deselectall"              android:layout_width="80dp"              android:layout_height="fill_parent"              android:text="取消选择" />      </LinearLayout>      <ListView          android:id="@+id/lv"          android:layout_width="fill_parent"          android:layout_height="fill_parent"          android:layout_below="@+id/line" />  </RelativeLayout>  

item.xml文件布局

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="horizontal" android:layout_width="match_parent"    android:layout_height="wrap_content">    <CheckBox        android:id="@+id/item_cb"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:clickable="false"        android:focusable="false"        android:focusableInTouchMode="false"        android:gravity="center_vertical" />    <TextView        android:id="@+id/item_tv"        android:layout_width="0dp"        android:layout_height="wrap_content"        android:layout_gravity="center_vertical"        android:layout_weight="1" /></LinearLayout>

MainActivity

public class MainActivity extends AppCompatActivity {    private ListView lv;    private MyAdapter mAdapter;    private ArrayList<String> list;    private Button bt_selectall;    private Button bt_cancel;    private Button bt_deselectall;    private int checkNum; // 记录选中的条目数量    private TextView tv_show;// 用于显示选中的条目数量    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        /* 实例化各个控件 */        lv = (ListView) findViewById(R.id.lv);        bt_selectall = (Button) findViewById(R.id.bt_selectall);        bt_cancel = (Button) findViewById(R.id.bt_cancleselectall);        bt_deselectall = (Button) findViewById(R.id.bt_deselectall);        tv_show = (TextView) findViewById(R.id.tv);        list = new ArrayList<String>();        // 为Adapter准备数据        initDate();        // 实例化自定义的MyAdapter        mAdapter = new MyAdapter(list, this);        // 绑定Adapter        lv.setAdapter(mAdapter);        // 全选按钮的回调接口        bt_selectall.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                // 遍历list的长度,将MyAdapter中的map值全部设为true                for (int i = 0; i < list.size(); i++) {                    MyAdapter.getIsSelected().put(i, true);                }                // 数量设为list的长度                checkNum = list.size();                // 刷新listview和TextView的显示                dataChanged();            }        });        // 反选按钮的回调接口        bt_cancel.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                // 遍历list的长度,将已选的设为未选,未选的设为已选                for (int i = 0; i < list.size(); i++) {                    if (MyAdapter.getIsSelected().get(i)) {                        MyAdapter.getIsSelected().put(i, false);                        checkNum--;                    } else {                        MyAdapter.getIsSelected().put(i, true);                        checkNum++;                    }                }                // 刷新listview和TextView的显示                dataChanged();            }        });        // 取消按钮的回调接口        bt_deselectall.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                // 遍历list的长度,将已选的按钮设为未选                for (int i = 0; i < list.size(); i++) {                    if (MyAdapter.getIsSelected().get(i)) {                        MyAdapter.getIsSelected().put(i, false);                        checkNum--;// 数量减1                    }                }                // 刷新listview和TextView的显示                dataChanged();            }        });        // 绑定listView的监听器        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {            @Override            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,                                    long arg3) {                // 取得ViewHolder对象,这样就省去了通过层层的findViewById去实例化我们需要的cb实例的步骤                MyAdapter.ViewHolder holder = (MyAdapter.ViewHolder) arg1.getTag();                // 改变CheckBox的状态                holder.cb.toggle();                // 将CheckBox的选中状况记录下来                MyAdapter.getIsSelected().put(arg2, holder.cb.isChecked());                // 调整选定条目                if (holder.cb.isChecked() == true) {                    checkNum++;                } else {                    checkNum--;                }                // 用TextView显示                tv_show.setText("已选中" + checkNum + "项");            }        });    }    // 初始化数据    private void initDate() {        for (int i = 0; i < 15; i++) {            list.add("data" + " " + i);        }    }    // 刷新listview和TextView的显示    private void dataChanged() {        // 通知listView刷新        mAdapter.notifyDataSetChanged();        // TextView显示最新的选中数目        tv_show.setText("已选中" + checkNum + "项");    }}

MyAdapter适配器

public class MyAdapter extends BaseAdapter {    // 填充数据的list    private ArrayList<String> list;    // 用来控制CheckBox的选中状况    private static HashMap<Integer, Boolean> isSelected;    // 上下文    private Context context;    // 用来导入布局    private LayoutInflater inflater = null;    // 构造器    public MyAdapter(ArrayList<String> list, Context context) {        this.context = context;        this.list = list;        inflater = LayoutInflater.from(context);        isSelected = new HashMap<Integer, Boolean>();        // 初始化数据        initDate();    }    // 初始化isSelected的数据    private void initDate() {        for (int i = 0; i < list.size(); i++) {            getIsSelected().put(i, false);        }    }    @Override    public int getCount() {        return list.size();    }    @Override    public Object getItem(int position) {        return list.get(position);    }    @Override    public long getItemId(int position) {        return position;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        ViewHolder holder = null;        if (convertView == null) {            // 获得ViewHolder对象            holder = new ViewHolder();            // 导入布局并赋值给convertview            convertView = inflater.inflate(R.layout.item, null);            holder.tv = (TextView) convertView.findViewById(R.id.item_tv);            holder.cb = (CheckBox) convertView.findViewById(R.id.item_cb);            // 为view设置标签            convertView.setTag(holder);        } else {            // 取出holder            holder = (ViewHolder) convertView.getTag();        }        // 设置list中TextView的显示        holder.tv.setText(list.get(position));        // 根据isSelected来设置checkbox的选中状况        holder.cb.setChecked(getIsSelected().get(position));        return convertView;    }    public static HashMap<Integer, Boolean> getIsSelected() {        return isSelected;    }    public static void setIsSelected(HashMap<Integer, Boolean> isSelected) {        MyAdapter.isSelected = isSelected;    }    public static class ViewHolder {        TextView tv;        CheckBox cb;    }}

本文转载自
http://blog.csdn.net/onlyonecoder/article/details/8687811