當(dāng)我們在使用ListView的時候姻锁,一般都會在getView()方法里面使用item復(fù)用的方式,如下:
ViweHolder view = null;
if(convertView == null){
...
}
....
return convertVew;
當(dāng)我們在Item有RadioGroup控件 渴析,或是需要有其他條件來判斷當(dāng)前Item是否需要展示一個或多個控件腊徙,當(dāng)我們隨意滑動ListView你會發(fā)現(xiàn)本來不滿足條件的Item也顯示出控件或者是錯位等情況简十。這就是由于復(fù)用導(dǎo)致的,解決方式有兩種:1撬腾、不使用item的復(fù)用,2恢恼、使用一個HashMap來保存position于數(shù)據(jù)之間的關(guān)系民傻。
//這里以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;
}
}