轻松解决listView数据混乱

时间:2021-09-11 03:37:27

方法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的状态

代码片段暂无