首页 > ExpandableListView 点击子列表中的 RadioButton 出现选中状态混乱

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

这个 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);
    }


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

【热门文章】
【热门文章】