参考: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;
}
}