android - ExpandableListView 点击子列表中的 RadioButton 出现选中状态混乱

浏览:61日期:2022-12-06

问题描述

这个 bug 比较诡异,想不出是什么原因,情况是这样的,添加了个 ExpandableListView 的控件,groupCount 为2,childCount分别为2,8,每个childview 中有一个TextView和 RadioButton,当点击第一个 group 中的 childview 中的RadioButton 后再展开第二个group发现其中里面有个RadioButton 已经被选中了。。。对应的Adapter 的代码是很常见的写法,RadioButton 的初始状态也都是unchecked 。但当把两个 group都展开再点击 RadioButton倒没有出现这个 bug,是因为这些RadioButton 在共用地址还是 id 的原因吗?求解~

public class InfoAdapter extends BaseExpandableListAdapter{ private String[][] mChildStrings; private String[] mGroupStrings; private OnRbClickListener mOnRbClickListener; private AppCompatRadioButton childRb1; private AppCompatRadioButton childRb2; private Context mContext; public InfoAdapter(Context context, String[] groupStrings, String[][] childStrings) {mContext = context;mGroupStrings = groupStrings;mChildStrings = childStrings; } public void updateData(String[] groupStrings, String[][] childStrings) {mGroupStrings = groupStrings;mChildStrings = childStrings;notifyDataSetChanged(); } //获取分组个数 @Override public int getGroupCount() {return mGroupStrings.length; } @Override public int getChildrenCount(int groupPosition) {return mChildStrings[groupPosition].length; } @Override public Object getGroup(int groupPosition) {return mGroupStrings[groupPosition]; } @Override public Object getChild(int groupPosition, int childPosition) {return mChildStrings[groupPosition][childPosition]; } @Override public long getGroupId(int groupPosition) {return groupPosition; } @Override public long getChildId(int groupPosition, int childPosition) {return childPosition; } @Override public boolean hasStableIds() {return true; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {GroupViewHolder groupViewHolder;if (convertView == null) { convertView = LayoutInflater.from(mContext).inflate(R.layout.item_expand_group, parent, false); groupViewHolder = new GroupViewHolder(); groupViewHolder.tvTitle = (TextView) convertView.findViewById(R.id.label_expand_group); convertView.setTag(groupViewHolder);} else { groupViewHolder = (GroupViewHolder) convertView.getTag();}groupViewHolder.tvTitle.setText(mGroupStrings[groupPosition]);return convertView; } @Override public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, final ViewGroup parent) {final ChildViewHolder childViewHolder;if (convertView == null) { convertView = LayoutInflater.from(mContext).inflate(R.layout.item_expand_child, parent, false); childViewHolder = new ChildViewHolder(); childViewHolder.tvTitle = (TextView) convertView.findViewById(R.id.tv_child); childViewHolder.mRadioButton = (AppCompatRadioButton) convertView.findViewById(R.id.rb_child); convertView.setTag(childViewHolder);} else { childViewHolder = (ChildViewHolder) convertView.getTag();}childViewHolder.tvTitle.setText(mChildStrings[groupPosition][childPosition]);childViewHolder.mRadioButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) {Logger.d(v.getId() + '');Logger.d(groupPosition + '');if (groupPosition == 0) { if (childRb1 != null && childRb1 != childViewHolder.mRadioButton) {childRb1.setChecked(false); } if (childRb2 != null){childRb2.setChecked(false); } childRb1 = childViewHolder.mRadioButton;} else { if (childRb2 != null && childRb2 != childViewHolder.mRadioButton) {childRb2.setChecked(false); } childRb2 = childViewHolder.mRadioButton;}if (mOnRbClickListener != null) { mOnRbClickListener.onRbClick(groupPosition, childPosition);} }});//childViewHolder.mCheckBox.setText(childStrings[groupPosition][childPosition]);return convertView; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) {return true; } class GroupViewHolder {TextView tvTitle; } class ChildViewHolder {TextView tvTitle;AppCompatRadioButton mRadioButton; } public void setOnRbClickListener(OnRbClickListener onRbClickListener) {mOnRbClickListener = onRbClickListener; } //child view radio button click listener public interface OnRbClickListener {void onRbClick(int groupPosition, int rbPosition); }

问题解答

回答1:

是因为convertView复用的问题,convertView == null去掉就可以,当然这样优化会差一些,不过影响不大

相关文章: