java - 滚动时单选按钮自行检查

标签 java android android-recyclerview radio-button radio-group

我制作了一个 RecyclerView,以 RadioButton 的形式显示 32 个问题和 4 个答案。当我单击单个单选按钮时,它会起作用,并且在选中它时会显示一个 toast 。

但是当我滚动 RecyclerView` 时,它会显示 toast,就像我选中了单选按钮一样。

如何修复它?

我的适配器:

public class sikapadapter extends RecyclerView.Adapter<sikapadapter.ViewHolder> {

    private int[] integer;
    String option[];
    private OnRadioChangeListener onRadioChangeListener;

    public sikapadapter(String[] option, OnRadioChangeListener onRadioChangeListener) {
        this.option = option;
        this.onRadioChangeListener = onRadioChangeListener;
        integer = new int[option.length];
    }

    interface OnRadioChangeListener{
        void onRadioChange(int position,int checkedId);
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        View view = inflater.inflate(R.layout.recycleview_sikap_layout,parent,false);
        sikapadapter.ViewHolder aadvh = new sikapadapter.ViewHolder(view);
        return aadvh;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {

        if(integer[position] == 1){
            holder.radio.check(R.id.radiobutton1);
        }else if(integer[position] == 2){
            holder.radio.check(R.id.radiobutton2);
        }else if(integer[position] == 3){
            holder.radio.check(R.id.radiobutton3);
        }else if(integer[position] == 4){
            holder.radio.check(R.id.radiobutton4);
        }else {
            holder.radio.clearCheck();
        }

        holder.text.setText(option[position]);

        holder.radio.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                if(onRadioChangeListener!=null){
                    if(checkedId == R.id.radiobutton1){
                        checkedId = 1;
                        integer[position] = 1;
                        onRadioChangeListener.onRadioChange(position,checkedId);
                    }

                    if(checkedId == R.id.radiobutton2){
                        checkedId = 2;
                        integer[position] = 2;
                        onRadioChangeListener.onRadioChange(position,checkedId);
                    }

                    if(checkedId == R.id.radiobutton3){
                        checkedId = 3;
                        integer[position] = 3;
                        onRadioChangeListener.onRadioChange(position,checkedId);
                    }

                    if(checkedId == R.id.radiobutton4){
                        checkedId = 4;
                        integer[position] = 4;
                        onRadioChangeListener.onRadioChange(position,checkedId);

                    }

                }
            }
        });


    }

    @Override
    public int getItemCount() {
        return option.length;
    }

    public class ViewHolder extends RecyclerView.ViewHolder{
        TextView text;
        RadioGroup radio;
        RadioButton radio1,radio2,radio3,radio4;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            text = itemView.findViewById(R.id.recytexttampil);
            radio = itemView.findViewById(R.id.radiogroup);
            radio1 = itemView.findViewById(R.id.radiobutton1);
            radio2 = itemView.findViewById(R.id.radiobutton2);
            radio3 = itemView.findViewById(R.id.radiobutton3);
            radio4 = itemView.findViewById(R.id.radiobutton4);


        }
    }
}

像这样 - 我从未检查过适配器位置 19,但是当我滚动时它会检查自身:

enter image description here

最佳答案

调用radio.check会触发任何OnCheckedChangeListener,因此当为回收的ViewHolder调用onBindViewHolder时,从之前的绑定(bind)被触发。

要解决此问题,请删除监听器,设置正确的选中项,然后设置新的监听器。

例如:

// Clear the listener so we don't trigger it
holder.radio.setOnCheckedChangeListener(null);

// Set the correct item to checked
if(integer[position] == 1){
    holder.radio.check(R.id.radiobutton1);
} else if (...) {
    // ...handle other cases here, removed to keep the example short...
}

holder.text.setText(option[position]);

// Put the listener back to watch for new changes
holder.radio.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
    //...

关于java - 滚动时单选按钮自行检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61691017/

相关文章:

java - JAXB 忽略 HashMap 属性?

java - 什么是正确使用泛型来解决这个编译错误?

java - 使 Button 对 ViewPager 上的第一张图像不可见,而对其余图像可见,onClickListener?

android - 意外的 CoordinatorLayout 行为

java - 如何使用Spring管理多个 "runtime noticed"与不同jdbc(或hibernate?)的数据库连接?

java - 使用方法在数组中搜索唯一名称

Android 搜索小部件 - onQueryTextSubmit 和将 Intent 发送到 SearchableActivity 之间的区别?

android - 以编程方式翻译 Activity 的动画

android - 当我滚动或添加新项目时,RecyclerView 数据移动到其他项目

java - 使用 Parse 和 RecyclerView 进行分页