ListView嵌套RadioGroup時選中混亂現象處理

問題描述

在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;
    }

}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容