效果图如下:
1、main.xml
encoding="utf-8"?>
>
/>
>
/>
2、listviewitem.xml
encoding="utf-8"?>
>
/>
3、MyAdapter.java
package com.example.checkboxactivity;
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
{ //
填充数据的list private
ArrayList
list; //
用来控制CheckBox的选中状况 private
static HashMap
isSelected; //
上下文 private
Context context; //
用来导入布局 private
LayoutInflater inflater = null;
//
构造器 public
MyAdapter(ArrayList list,
Context context) { this.context = context; this.list = list; inflater = LayoutInflater.from(context); isSelected = new HashMap
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.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 { // 取出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
getIsSelected() { return isSelected; }
public
static void setIsSelected(HashMap
Boolean> isSelected) { MyAdapter.isSelected = isSelected; }
public
static class ViewHolder { TextView tv; CheckBox cb; } }
4、Ex_checkboxActivity.java
package com.example.checkboxactivity;
import java.util.ArrayList;
import com.example.checkboxactivity.MyAdapter.ViewHolder;
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
list; private
Button bt_selectall; private
Button bt_cancel; private
Button bt_deselectall; private int
checkNum; // 记录选中的条目数量 private
TextView tv_show;// 用于显示选中的条目数量
@Override public 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_cancleselectall); bt_deselectall = (Button)
findViewById(R.id.bt_deselectall); tv_show = (TextView) findViewById(R.id.tv); list = new
ArrayList(); // 为Adapter准备数据 initDate(); // 实例化自定义的MyAdapter mAdapter = new MyAdapter(list, this); // 绑定Adapter lv.setAdapter(mAdapter);
// 全选按钮的回调接口 bt_selectall.setOnClickListener(new 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 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++; } }