찾다

 >  Q&A  >  본문

android - 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);
    }

大家讲道理大家讲道理2767일 전1026

모든 응답(1)나는 대답할 것이다

  • 迷茫

    迷茫2017-04-17 17:36:35

    convertView 재사용 문제 때문입니다. 그냥 ConvertView == null만 제거하면 최적화가 더 안 좋아지겠지만 영향은 크지 않을 것입니다

    회신하다
    0
  • 취소회신하다