問題描述
在ListView的Adapter中重寫getView方法;為每個item中的RadioGroup設置監聽,我的項目中是每個條目中有3個RadioButton。當選中某個條目的RadioButton后上下拉動LisetView發現沒有設置選中的條目會模仿前面的條目導致整個界面選中混亂不堪。
示列
問題根源
原因是因為listview的復用機制導致的監聽器混亂
解決方式
RadioButton選中前先取消掉監聽器
上代碼
javaBean
public class DealSettingBean {
public int wheel; //輪
public int cardCount; //牌數
public int checked; //用來記錄選中的第幾個按鈕
}
ListView的數據集合
//模擬數據
ArrayList<DealSettingBean> mArrayList = new ArrayList();
for (int i = 0; i <20; i++) {
DealSettingBean mDealSettingBean = new DealSettingBean();
mDealSettingBean.wheel=(i+1);
mDealSettingBean.cardCount=1;
mDealSettingBean.checked =3;
mArrayList.add(mDealSettingBean);
}
DealSettingAdapter mDealSettingAdapter = new DealSettingAdapter(this,mArrayList);
mListview.setAdapter(mDealSettingAdapter);
適配器設置
public class DealSettingAdapter extends BaseAdapter {
private static final String TAG = "DealSettingAdapter";
private Context mContext;
private ArrayList<DealSettingBean> mData;
public DealSettingAdapter(Context mcontext, ArrayList<DealSettingBean> mArrayList) {
this.mContext = mcontext;
this.mData = mArrayList;
}
@Override
public int getCount() {
return mData == null ? 0 : mData.size();
}
@Override
public DealSettingBean getItem(int position) {
return mData == null ? null : mData.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = View.inflate(mContext, R.layout.item_deal_setting, null);
holder = new ViewHolder();
holder.mTv = (TextView) convertView.findViewById(R.id.item_deal_setting_tv);
holder.mRadioGroup = (RadioGroup) convertView.findViewById(R.id
.item_deal_setting_radiogroup);
holder.mRadioButton1 = (RadioButton) convertView.findViewById(R.id
.item_deal_setting_radioBtn1);
holder.mRadioButton2 = (RadioButton) convertView.findViewById(R.id
.item_deal_setting_radioBtn2);
holder.mRadioButton3 = (RadioButton) convertView.findViewById(R.id
.item_deal_setting_radioBtn3);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
DealSettingBean itemBean = mData.get(position);
holder.mTv.setText(itemBean.wheel + "");
//取消監聽器,防止RadioGroup顯示混亂 關鍵代碼
holder.mRadioGroup.setOnCheckedChangeListener(null);
switch (itemBean.checked) {
case 1:
holder.mRadioGroup.check(R.id.item_deal_setting_radioBtn1);
break;
case 2:
holder.mRadioGroup.check(R.id.item_deal_setting_radioBtn2);
break;
case 3:
holder.mRadioGroup.check(R.id.item_deal_setting_radioBtn3);
break;
default:
holder.mRadioGroup.clearCheck();
break;
}
holder.mRadioGroup.setId(position);
holder.mRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, @IdRes int checkedId) {
DealSettingBean bean = mData.get(group.getId());
switch (checkedId) {
case R.id.item_deal_setting_radioBtn1:
bean.checked = 1;
break;
case R.id.item_deal_setting_radioBtn2:
bean.checked = 2;
break;
case R.id.item_deal_setting_radioBtn3:
bean.checked = 3;
break;
}
}
});
return convertView;
}
class ViewHolder {
TextView mTv;
RadioGroup mRadioGroup;
RadioButton mRadioButton1;
RadioButton mRadioButton2;
RadioButton mRadioButton3;
}
}