解决ListView中item存在多个RadioButton并且选中状态混乱问题

参考https://blog.csdn.net/qq_27035123/article/details/52191989

关键点:先置空RadioGroup的OnCheckedChangeListense,然后再对其进行相关设置。

出现问题的原因:因为使用ViewHolder导致item复用,进而导致item中RadioButton选中状态被复用问题。

解决思路:首先建立一个HashMap记录RadioButton的选中状态,RadioGroup进行setTag传入positon,再次进行OnCheckedChangeListense时备用

       我们一般的写法是先设置RadioGroup的OnCheckedChangeListense,根据位置,记录选中状态。然后再根据记录的选中状态,对RadioButton设置setChecked为true或false。但因为我们使用viewHolder,对convertView进行了复用,如果你选中第一个item的RadioButton的话,那么item布局较多显示内容超过一屏,第一屏不可见的内容变为可见时,从未操作过的item的RadioButton居然被选中,所以我们只能对每个item的RadioGroup中的进行监听,所以先废除掉原来监听,建立新的监听事件。

public class CheckItem extends BaseAdapter {
    ...
    //记录RadioButton的状态
    public HashMap<Integer, String> state_boolean = new HashMap<>();
   ...
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        final ViewHolder viewHolder;
        if (convertView == null) {
            LayoutInflater mInflater = LayoutInflater.from(context);
            convertView = mInflater.inflate(R.layout.item_check, null);
            viewHolder = new ViewHolder();
            viewHolder.m_yes = convertView.findViewById(R.id.btn_YES);
            viewHolder.m_no = convertView.findViewById(R.id.btn_NO);
            viewHolder.radioGroup = convertView.findViewById(R.id.radioGroupID);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        viewHolder.loadingCheckShowType.setText((String) listData.get(position).get("checkName"));
        viewHolder.radioGroup.setTag(position);
        viewHolder.m_yes.setTag(position);
        viewHolder.m_no.setTag(position);
        viewHolder.m_yes.clearFocus();
        viewHolder.m_no.clearFocus();
        ...
        viewHolder.radioGroup.setTag(position);
        viewHolder.radioGroup.setOnCheckedChangeListener(null);
        //选中状态的恢复
        String type = state_boolean.get(position);
        if (null != type) {
            if (type.equals("是")) {
                viewHolder.radioGroup.check(R.id.btn_YES);
            } else if (type.equals("否")) {
                viewHolder.radioGroup.check(R.id.btn_NO);
            } else {
                viewHolder.radioGroup.clearCheck();
            }
        } else {
            viewHolder.radioGroup.clearCheck();
        }
        viewHolder.radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup radioGroup, int checkedId) {
                int hadOperatePosition = (Integer) viewHolder.radioGroup.getTag();
                if (position == hadOperatePosition) {
                    if (checkedId == viewHolder.m_yes.getId()) {
                        state_boolean.put(position, "是");
                    } else if (checkedId == viewHolder.m_no.getId()) {
                        state_boolean.put(position, "否");
                    }else {
                        state_boolean.put(position, "");
                    }
                }
            }
        });

        viewHolder.m_yes.addTextChangedListener(new TextWatcher() {
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

            @Override
            public void afterTextChanged(Editable s) {
                Integer tag = (Integer) viewHolder.m_yes.getTag();
                state_boolean.put(tag, s.toString());
            }
        });

        viewHolder.m_no.addTextChangedListener(new TextWatcher() {
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

            @Override
            public void afterTextChanged(Editable s) {
                Integer tag = (Integer) viewHolder.m_no.getTag();
                state_boolean.put(tag, s.toString());
            }
        });
        return convertView;
    }

    public static class ViewHolder {
        RadioButton m_yes, m_no;
        RadioGroup radioGroup;
    }
}
发布了19 篇原创文章 · 获赞 0 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/ds19920925/article/details/105727218