*(一)概述
(二)导致ListView的checkbox错位的原因
网上找来的一幅关于ListView getView方法调用机制的一个图片:
从图中看出,Postion从12开始,ConvertView就不为空了,具体这里代表的是什么, 我也不知道,我们知道这里ConvertView会缓存就好,就是因为这个原因 造成的checkbox错位,所以第一个解决方式就是,不重用这个ConvertView,或者 说每次getView都将这个ConvertView设置为null,但是如果需要显示的Item数目巨大的话, 这种方法就会显得非常臃肿,一般实际开发我们使用的是下面的解决方法:
找个东东来保存当前Item CheckBox的状态,初始化的时候进行判断,设置是否选中!
2.解决方法示例:
好的存储这个Checkbox的方法有很多,你可以放到一个HashMap中,
每次初始化的时候根据postion取出对应的boolean值,然后再进行checkbox的状态设
置;
而笔者的做法则是在entity类中加入了一个boolean值用于判断,下面是笔者一个项目中
抽取出来的代码,代码比较简单,相信你看完会秒懂的~
Entity类:Person.java
Entity类:Person.java:
public class Person implements Serializable{
private String name;
private String number;
private boolean checkStatus;
public Person(String name, String number) {
super();
this.name = name;
this.number = number;
this.checkStatus = false;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNumber() {22. return number;
}
public void setNumber(String number) {
this.number = number;
}
public boolean getCheckStatus() {
return checkStatus;
}
public void setCheckStatus(boolean checkStatus) {
this.checkStatus = checkStatus;
}
}
实现的Adapter类:ContactListAdapter.java:
public class ContactListAdapter extends BaseAdapter implements
CompoundButton.OnCheckedChangeListener{
private List<Person> mData;
private Context mContext;
public ContactListAdapter(List<Person> data, Context context) {
mData = data;
mContext = context;
}
// 定义一个刷新数据的方法
public void changeData(List<Person> data) {
mData = data;
notifyDataSetChanged();
}
@Override
public int getCount() {
return mData.size();
}
@Override
public Person getItem(int position) {
return mData.get(position);25. }
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup
parent) {
final Person person = mData.get(position);
ViewHolder viewHolder;
if (convertView == null) {
convertView = LayoutInflater.from(mContext).inflate(
R.layout.item_contact, parent, false);
viewHolder = new ViewHolder();
viewHolder.ly = (RelativeLayout) convertView
.findViewById(R.id.lyContactListItem);
viewHolder.txtName = (TextView) convertView
.findViewById(R.id.txtName);
viewHolder.txtNumber = (TextView) convertView
.findViewById(R.id.txtNumber);
viewHolder.cbxStatus = (CheckBox) convertView
.findViewById(R.id.cbxStatus);
convertView.setTag(viewHolder);
viewHolder.cbxStatus.setTag(person);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.cbxStatus.setOnCheckedChangeListener(this);
viewHolder.cbxStatus.setChecked(person.getcheckStatus());
viewHolder.txtName.setText(person.getName());
viewHolder.txtNumber.setText(person.getNumber());
return convertView;
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean
isChecked) {
Person person = (Person)buttonView.getTag();
person.setCheckStatus(isChecked);
}
private class ViewHolder {
RelativeLayout ly;
TextView txtName;
TextView txtNumber;
CheckBox cbxStatus;
}
}