首页 > 解决方案 > 切换按钮 Recyclerview 问题

问题描述

我有这个问题让我发疯。当检索到 JSON 数据时,我将使用我的适配器:

 @Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {

    if (holder instanceof OriginalViewHolder) {
        final DomandaQuizTipo1 domandaQuiz1 = items.get(position);

        OriginalViewHolder vItem = (OriginalViewHolder) holder;

        /* Getting each answer from array of answer */
        Risposta1 risposta1 = domandaQuiz1.getRisposte().get(0);
        Risposta1 risposta2 = domandaQuiz1.getRisposte().get(1);
        Risposta1 risposta3 = domandaQuiz1.getRisposte().get(2);

        /* Get and set text of question */
        vItem.domanda.setTypeface(typefaceRegular);
        vItem.domanda.setText(domandaQuiz1.getDomanda());

        /* Get and set text of answer 1 */
        vItem.risposta1.setText(risposta1.getRisposta());
        vItem.risposta1.setTextOn(risposta1.getRisposta());
        vItem.risposta1.setTextOff(risposta1.getRisposta());

        /* Get and set text of answer 2 */
        vItem.risposta2.setText(risposta2.getRisposta());
        vItem.risposta2.setTextOn(risposta2.getRisposta());
        vItem.risposta2.setTextOff(risposta2.getRisposta());

        /* Get and set text of answer 3 */
        vItem.risposta3.setText(risposta3.getRisposta());
        vItem.risposta3.setTextOn(risposta3.getRisposta());
        vItem.risposta3.setTextOff(risposta3.getRisposta());

        /* When i click the first answer uncheck 2nd and 3rd */
        vItem.risposta1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MainActivity.punteggiDomandeQuiz1[position] = items.get(position).getRisposte().get(0).getPunteggio();
                MainActivity.UpdatePunteggioTotale();

                vItem.risposta2.setChecked(false);
                vItem.risposta3.setChecked(false);

            }
        });
        /* When i click the second answer uncheck 1st and 3rd */
        vItem.risposta2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MainActivity.punteggiDomandeQuiz1[position] = items.get(position).getRisposte().get(1).getPunteggio();
                MainActivity.UpdatePunteggioTotale();
                Log.d("adapterposition", "POS" + position);

                vItem.risposta1.setChecked(false);
                vItem.risposta3.setChecked(false);

            }
        });
        /* When i click the third answer uncheck 1st and 2nd */
        vItem.risposta3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MainActivity.punteggiDomandeQuiz1[position] = items.get(position).getRisposte().get(2).getPunteggio();
                MainActivity.UpdatePunteggioTotale(); 
                vItem.risposta1.setChecked(false);
                vItem.risposta2.setChecked(false);

            }
        });


    } else {
        ((ProgressViewHolder) holder).progressBar.setIndeterminate(true);
    }
}

我的问题是:在每个包含 3 个答案的问题的回收器视图中,当我点击一个答案(例如第一个切换按钮)时,正确检查但当我滚动回收器视图时,我看到其他问题的答案(例如。第一个切换按钮)选中。

我怎样才能避免这个问题?看看我在下面放的这个 gif。

请检查 gif 以了解

标签: androidandroid-recyclerviewtogglebutton

解决方案


您应该添加一个类似于 selected (本地而不是服务器)的字段并检查它是否被选中并更改项目 ui

    if(vItem.selected==1)
        vItem.risposta1.setChecked(true);
    else  
        vItem.risposta1.setChecked(false);

    if(vItem.selected==2)
        vItem.risposta2.setChecked(true);
    else  
        vItem.risposta2.setChecked(false);
    if(vItem.selected==3)
        vItem.risposta3.setChecked(true);
    else  
        vItem.risposta3.setChecked(false);
    vItem.risposta1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MainActivity.punteggiDomandeQuiz1[position].selected=1;
                notifyItemChange(adapterPosition);

            }
    });
    vItem.risposta2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MainActivity.punteggiDomandeQuiz1[position].selected=2;
                notifyItemChange(adapterPosition);

            }
    });
    vItem.risposta3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MainActivity.punteggiDomandeQuiz1[position].selected=3;
                notifyItemChange(adapterPosition);

            }
        });

推荐阅读