方法1:遵循(1)(2)(3)顺序
package com.example.listview;
import java.util.ArrayList;
import java.util.HashMap;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.TextView;
/**
* 要点:获取控件和设置监听在if (convertView==null) {... }else{}之后
* @author haie
*
*/
public class MyAdapter2 extends BaseAdapter {
HashMap<Integer, Boolean>select=new HashMap<>();
private ArrayList<Bean> datas;
private Context context;
public MyAdapter2(Context context,ArrayList<Bean> datas){
this.context=context;
this.datas=datas==null?new ArrayList<Bean>():datas;
initData();
}
private void initData() {
for(int i=0;i<datas.size();i++){
select.put(i, false);
}
}
@Override
public int getCount() {
return datas.size();
}
@Override
public Object getItem(int position) {
return datas.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder=null;
if (convertView==null) {
//(1)
convertView=View.inflate(context, R.layout.item_data, null);
holder=new ViewHolder();
convertView.setTag(holder);
}else{
holder=(ViewHolder)convertView.getTag();
}
//(2)
holder.cb=(CheckBox) convertView.findViewById(R.id.checkBox1);
holder.cb.setOnCheckedChangeListener(new OnCheckedChangeListener(){
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
select.put(position, isChecked);
}
});
holder.tvName=(TextView)convertView.findViewById(R.id.tvName);
holder.tvPosition=(TextView)convertView.findViewById(R.id.tvPosition);
//(3)
Bean bean=datas.get(position);
holder.tvName.setText(bean.getName());
holder.tvPosition.setText(position+"");
if(select.get(position)){
holder.cb.setChecked(true);
}else{
holder.cb.setChecked(false);
}
return convertView;
}
class ViewHolder{
CheckBox cb;
TextView tvName;
TextView tvPosition;
}
}
方法2:参照网上的
思路:1.定义成员变量lmap缓存convertView,isSelect缓存选择的checkbox的值
2.判断convertView==null添加到lmap不为空直接从lmap中取出convertView
HashMap<Integer, Boolean>select=new HashMap<>();
HashMap<Integer, View>lmap=new HashMap<>();
private ArrayList<Bean> datas;
private Context context;
public MyAdapter(Context context,ArrayList<Bean> datas){
this.context=context;
this.datas=datas==null?new ArrayList<Bean>():datas;
initData();
}
private void initData() {
for(int i=0;i<datas.size();i++){
select.put(i, false);
}
}
@Override
public int getCount() {
return datas.size();
}
@Override
public Object getItem(int position) {
return datas.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder=null;
if (lmap.get(position)==null) {
convertView=View.inflate(context, R.layout.item_data, null);
holder=new ViewHolder();
holder.cb=(CheckBox) convertView.findViewById(R.id.checkBox1);
holder.cb.setOnCheckedChangeListener(new OnCheckedChangeListener(){
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
select.put(position, isChecked);
}
});
holder.tvName=(TextView)convertView.findViewById(R.id.tvName);
holder.tvPosition=(TextView)convertView.findViewById(R.id.tvPosition);
lmap.put(position, convertView);
convertView.setTag(holder);
}else{
convertView=lmap.get(position);
holder=(ViewHolder)convertView.getTag();
}
Bean bean=datas.get(position);
holder.tvName.setText(bean.getName());
holder.tvPosition.setText(position+"");
if(select.get(position)){
holder.cb.setChecked(true);
}else{
holder.cb.setChecked(false);
}
return convertView;
}
class ViewHolder{
CheckBox cb;
TextView tvName;
TextView tvPosition;
}
方法3:最简单的在实体类添加一个属性变量来保存checkbox的状态
代码片段暂无