android UI进阶之实现listview中checkbox的多选与记录

今天继续和大家分享涉及到listview的内容。在很多时候,我们会用到listview和checkbox配合来提供给用户一些选择操作。比如在一个清单页面,我们需要记录用户勾选了哪些条目。这个的实现并不太难,但是有很多朋友来问我如何实现,他们有遇到各种各样的问题,这里就一并写出来和大家一起分享。

ListView的操作就一定会涉及到item和Adapter,我们还是先来实现这部分内容。

首先,写个item的xml布局,里面放置一个TextView和一个CheckBox。要注意的时候,这里我设置了CheckBox没有焦点,这样的话,无法单独点击checkbox,而是在点击listview的条目后,Checkbox会响应操作。

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=""android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="horizontal" ><TextViewandroid:id="@+id/item_tv"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:gravity="center_vertical"/><CheckBoxandroid: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"/></LinearLayout>

下面就写一个Adapter类,我们依然继承BaseAdapter类。这里我们使用一个HashMap<Integer,boolean>的键值来记录checkbox在对应位置的选中状况,这是本例的实现的基础。

package com.notice.listcheck;import java.util.ArrayList;import java.util.HashMap;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.CheckBox;import android.widget.TextView;public class MyAdapter extends BaseAdapter{// 填充数据的listprivate 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);}}@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int position) {return list.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder = null;if (convertView == null) {// 获得ViewHolder对象holder = new ViewHolder();// 导入布局并赋值给convertviewconvertView = inflater.inflate(R.layout.listviewitem, null);holder.tv = (TextView) convertView.findViewById(R.id.item_tv);holder.cb = (CheckBox) convertView.findViewById(R.id.item_cb);// 为view设置标签convertView.setTag(holder);} else {// 取出holderholder = (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;}}

注释已经写的非常详尽了,通过

holder.cb.setChecked(getIsSelected().get(position));

这行代码我们实现了设置CheckBox的选中状况。

那么我们只需要在点击事件中,控制isSelected的键值即可控制对应位置checkbox的选中了。

在Activity中我们除了放置一个ListView外,还放置了三个按钮,分别实现全选,取消和反选。

看下Activity类的代码:

package com.notice.listcheck;import java.util.ArrayList;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.Button;import android.widget.ListView;import android.widget.TextView;public class Ex_checkboxActivity extends Activity {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. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);/* 实例化各个控件 */lv = (ListView) findViewById(R.id.lv);bt_selectall = (Button) findViewById(R.id.bt_selectall);bt_cancel = (Button) findViewById(R.id.bt_cancelselectall);bt_deselectall = (Button) findViewById(R.id.bt_deselectall);tv_show = (TextView) findViewById(R.id.tv);list = new ArrayList<String>();// 为Adapter准备数据initDate();// 实例化自定义的MyAdaptermAdapter = new MyAdapter(list, this);// 绑定Adapterlv.setAdapter(mAdapter);// 全选按钮的回调接口bt_selectall.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// 遍历list的长度,将MyAdapter中的map值全部设为truefor (int i = 0; i < list.size(); i++) {MyAdapter.getIsSelected().put(i, true);}// 数量设为list的长度checkNum = list.size();// 刷新listview和TextView的显示dataChanged();}});// 取消按钮的回调接口bt_cancel.setOnClickListener(new OnClickListener() {@Overridepublic 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();}});// 反选按钮的回调接口bt_deselectall.setOnClickListener(new OnClickListener() {@Overridepublic 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();}});// 绑定listView的监听器lv.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {// 取得ViewHolder对象,这样就省去了通过层层的findViewById去实例化我们需要的cb实例的步骤          ViewHolder holder = (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 + "项");}}

代码中在item的点击事件中,直接调用

holder.cb.toggle();

先改变CheckBox的状态,然后将值存进map记录下来

MyAdapter.getIsSelected().put(arg2, holder.cb.isChecked());

这些那些,我们是多么的了然于心,却依然,没有任何办法。

android UI进阶之实现listview中checkbox的多选与记录

相关文章:

你感兴趣的文章:

标签云: