滚动时自行检查单选按钮 [英] Radio button checked by itself when scrolling

查看:56
本文介绍了滚动时自行检查单选按钮的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我制作了一个RecyclerView,将32个问题和4个答案显示为RadioButton.当我单击单个单选按钮时,它会起作用,并且在选中它时会显示祝酒词.

I made a RecyclerView that shows 32 question and 4 answers as RadioButtons. When I click a single radio button, it works, and I show a toast when it is checked.

但是当我滚动RecyclerView`时,它显示了吐司,就像我选中了一个单选按钮一样.

But when I scroll the RecyclerView`, it shows toasts like I checked a radio button.

我该如何解决?

我的适配器:

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,但是在滚动时会检查自身:

Like this - I never checked adapter position 19, but when I scroll it checks itself:

推荐答案

调用radio.check会触发任何OnCheckedChangeListener,因此,当为回收的ViewHolder调用onBindViewHolder时,从上一个绑定附加的侦听器为触发.

Calling radio.check triggers any OnCheckedChangeListeners, so when onBindViewHolder is called for a recycled ViewHolder, the listener that was attached from the previous bind is triggered.

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

To solve it, remove the listener, set the correct checked item, then set the new listener.

例如:

// 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() {
    //...

这篇关于滚动时自行检查单选按钮的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆