最近小组成员,在使用listview中出现了奇怪的现象,先描述一下这个奇怪的现象:首先他给checkbox设定了OnCheckedChangeListener监听器,当点击的时候,就修改该条item,对应的bean中保存的checkbox状态值,并且将该item添加到选中的集合中,反之就去除集合中的该元素,当convertView复用的时候,他又重新设定当前的状态。可是其奇怪的现象出现了,当复用convertView的使用,任然没有保存状态。那么好,我们看看该问题所在的getView()方法。
我仿照他的写法写了一个:
private Context mContext;
private List<ListBean> mAdapterDataList;
private LayoutInflater mInflater;
public MyAdapter(Context context, List<ListBean> dataList) {
this.mContext = context;
this.mAdapterDataList = dataList;
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
if (mAdapterDataList == null) {
return 0;
}
return mAdapterDataList.size();
}
@Override
public ListBean getItem(int position) {
return mAdapterDataList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.layout.item_activity_main, parent, false);
convertView.setTag(new ViewHolder(convertView));
}
ViewHolder holder = (ViewHolder) convertView.getTag();
//设定checkbox的状态
**holder.mCheckBox.setChecked(getItem(position).isCheck());**
holder.mTextView.setText(getItem(position).getText());
//给监听器中设定当前的需要操作的对象
holder.mCheckBox.setTag(getItem(position));
holder.mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
**public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// 在这里进行保存自己选中的item
ListBean bean = (ListBean) buttonView.getTag();
//保存checkbox对应的状态
bean.setCheck(isChecked);
if (isChecked) {
if (!mSelectItem.contains(bean)) {
mSelectItem.add(bean);
}
} else {
mSelectItem.remove(bean);
}
}**
});
return convertView;
}
}
public static class ViewHolder {
private CheckBox mCheckBox;
private TextView mTextView;
public ViewHolder(View view) {
mCheckBox = (CheckBox) view.findViewById(R.id.check_box);
mTextView = (TextView) view.findViewById(R.id.text_view);
}
}`
不知道你有没有发现这段代码中的bug,我来看看他需要改进的地方
第一:在convertView 不为null的时候,他在调用holder.mCheckBox.setChecked(getItem(position).isCheck());方法的时候,会触复用前一convertView的OnCheckedChangeListener的onCheckedChanged()的方法,就会把之前的那个状态给改变掉,这也就为什么出现没有没有保存状态的原因。
第二:每次复用convertView 的时候,都会new OnCheckedChangeListener的对象,就会造成创建很多OnCheckedChangeListener对象,那么对内存管理来说也不是很好。
解决办法:
1、解决第一个bug,将设置OnCheckedChangeListener监听器和holder.mCheckBox.setChecked(getItem(position).isCheck())方法的顺序调换一下,那么就不会出现下一个复用,调用上一个的onCheckedChanged()方法。
2、解决第二个bug,当convertView==null的时候设定监听器,那么就不会创建多余的监听器。