PS:提供这两种办法的人都没有解释到底是为什么错乱.下面来尝试分析一下:
1:首先分析下viewHolder.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener()…);
这句话,就是给checkBox添加一个监听器,如果checkBox的状态改变了,那么系统就会自动回调里面的onCheckedChange()方法.
而文中onCheckedChange()方法里写的是记录这次改变后checkBox状态的代码.
2:再接着分析下if(list.get(position).type == A.TYPE_CHECKED){…},这部分代码是根据list集合里的对象属性初始化view里checkBox是否应该是选择状态.
3:我上下滑动listView的时候,checkBox的状态就错乱了,根据第二点的分析,无论如何checkBox的状态都不会错乱,除非list集合里对象的属性已经被改变了,到底是什么地方改变了它?
4:文中只有一个地方写了改变list集合里checkBox对象属性的地方,那就是第一点里提到的OnCheckedChangeListener()方法。它被执行了?
怎么回事,不可能吧,打个断点,跑一下便知上下滑动listView的时候确实停了下来.
5:这便是convertView的功能,因为不管listView里显示多少条数据,都只是共用那么几个对象,然后我们的代码每一次把得到的对象重新赋值而已。
对了,正是在这赋值的时候出了问题,假设android系统给我们生成了10个共用view对象,第一个view对象在第一屏的时候需要显示成”未选择”状态,而到了第二屏的时候,却要显示成”选择”状态,但由于是共用的同一个对象,根据第一点得知当checkBox的状态改变的时候,会调用onCheckedChange()方法。
以下是在代码中的解决方案
package com.bawei.studentshop.adapter;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;
import com.bawei.studentshop.R;
import com.bawei.studentshop.bean.ShoopCarResponse;
import java.util.List;
/**
* Created by Administrator on 2016/7/15 0015.
*/
public class ShopCarAdapter extends BaseAdapter {
private Context context;
private List list;
private int count = 0;
public ShopCarAdapter(Context context, List list) {
this.context = context;
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = View.inflate(context, R.layout.shoopingcrtlist_item, null);
holder.cb = (CheckBox) convertView.findViewById(R.id.cbCheckBox);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
//重点就是给每个CheckBox控件设置标记
holder.cb.setTag(position);
holder.cb.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//先把View转型为CheckBox
CheckBox c= (CheckBox) v;
//获取当前控件的Tag,即与其绑定的position
int po = (int) c.getTag();
//判断当前控件是否选中
if (c.isChecked()) {
//若选中,就根据绑定的position找到相对应的控件设置状态为turn
list.get(po).setCheck(true);
}else{
//若未选中,就根据绑定的position找到相对应的控件设置状态为false
list.get(po).setCheck(false);
}
}
});
holder.cb.setChecked(list.get(position).isCheck());
holder.title.setText(list.get(position).getName());
holder.number.setText(list.get(position).getCid() + "");
holder.price.setText("¥" + list.get(position).getCost());
return convertView;
}
class ViewHolder {
TextView title, number, price;
ImageView goodsImg, jian, jia, jianTou;
CheckBox cb;
}
}