当我们在使用ListView的时候,一般都会在getView()方法里面使用item复用的方式,如下:
ViweHolder view = null;
if(convertView == null){
...
}
....
return convertVew;
当我们在Item有RadioGroup控件 ,或是需要有其他条件来判断当前Item是否需要展示一个或多个控件,当我们随意滑动ListView你会发现本来不满足条件的Item也显示出控件或者是错位等情况。这就是由于复用导致的,解决方式有两种:1、不使用item的复用,2、使用一个HashMap来保存position于数据之间的关系。
//这里以RadioButon为例
public class RadioAdapter extends BaseAdapter {
Map map = new HashMap<Integer,Integer>();
@Override
public int getCount() {
return 0;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
VIewHolder vh = null;
if(convertView == null){
convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.radioItem,parent,false);
holder = createViewHolder(convertView);
convertView.setTag(holder);
}else{
vh = convertView.getTag();
}
vh.radioButton.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
swicth(checkedId){
case R.id.x:
map.put(position,checkedId);
break;
case R.id.y:
map.put(position,checkedId);
break;
}
}
});
if(map.containsKey(position)){
if(map.get(position) == R.id.x){
vh.rbx.setChecked(true);
}else if(map.get(position) == R.id.y){
vh.rby.setChecked(true);
}
}else{
}
return convertView;
}
}