一,首先定義一個類來關聯Adapter和Activity可以記住點擊的位置
public class MyViewHoler{
public CheckBox cb;
public TextView tv;
}
二,Adapter的寫法
package com.example.listviewcheckdemo;
import java.util.HashMap;
import java.util.List;
import android.annotation.SuppressLint;
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;
/**
*
* @author LiuZiwei
* 選列表adapter
*
*/
public class CheckAdapter extends BaseAdapter{
public static HashMap<Integer, Boolean> isSelected;
private Context context = null;
private List<String> list = null;
@SuppressLint("UseSparseArrays")
public CheckAdapter(Context context, List<String> list) {
this.context = context;
this.list = list;
isSelected = new HashMap<Integer, Boolean>();
for (int i = 0; i < list.size(); i++) {
isSelected.put(i, false);
}
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int arg0) {
return list.get(arg0);
}
@Override
public long getItemId(int arg0) {
return 0;
}
@Override
public View getView(int position, View view, ViewGroup arg2) {
MyViewHoler holder = null;
if (view == null) {
holder = new MyViewHoler();
view = LayoutInflater.from(context).inflate(R.layout.check_item, null);
holder.tv = (TextView) view.findViewById(R.id.item_tv);
holder.cb = (CheckBox) view.findViewById(R.id.item_cb);
view.setTag(holder);
} else {
holder = (MyViewHoler) view.getTag();
}
holder.tv.setText(list.get(position));
holder.cb.setChecked(isSelected.get(position));
return view;
}
}
三、Activity裏的寫法
public class MainActivity extends Activity {
private ListView listview_check;
private CheckAdapter adapter;
/** 初始化數據*/
private List<String> newList=new ArrayList<String>();
/** 存儲點擊選中的數據*/
private List<String> checkList=new ArrayList<String>();
/** 全選*/
private Button btn_all;
/** 反選*/
private Button btn_clear;
/** 取消已選*/
private Button btn_cancel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listview_check=(ListView) findViewById(R.id.listview);
btn_all=(Button) findViewById(R.id.all);
btn_clear=(Button) findViewById(R.id.clear);
btn_cancel=(Button) findViewById(R.id.cancel);
/** 初始化數據*/
for(int i=0;i<10;i++){
newList.add("選項"+i);
}
adapter=new CheckAdapter(this, newList);
listview_check.setAdapter(adapter);
listview_check.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View view, int position,
long arg3) {
// TODO Auto-generated method stub
MyViewHoler holder=(MyViewHoler) view.getTag();
holder.cb.toggle();// 在每次獲取點擊的item時改變checkbox的狀態
CheckAdapter.isSelected.put(position, holder.cb.isChecked()); // 同時修改map的值保存狀態
if (holder.cb.isChecked() == true) {
checkList.add(newList.get(position));
} else {
checkList.remove(newList.get(position));
}
Log.e("----", "---------"+checkList.toString());
}
});
/** 全選*/
btn_all.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
checkList.clear();
for(int i=0;i<newList.size();i++){
CheckAdapter.isSelected.put(i,true);
checkList.add(newList.get(i));
}
adapter.notifyDataSetChanged();//注意這一句必須加上,否則checkbox無法正常更新狀態
}
});
/** 反選*/
btn_clear.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
for(int i=0;i<newList.size();i++){
if(CheckAdapter.isSelected.get(i)==false){
CheckAdapter.isSelected.put(i, true);
checkList.add(newList.get(i));
}
else{
CheckAdapter.isSelected.put(i, false);
checkList.remove(newList.get(i));
}
}
adapter.notifyDataSetChanged();
}
});
/** 取消已選*/
btn_cancel.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
for(int i=0;i<newList.size();i++){
if(CheckAdapter.isSelected.get(i)==true){
CheckAdapter.isSelected.put(i, false);
checkList.remove(newList.get(i));
}
}
adapter.notifyDataSetChanged();
}
});
}