【问题标题】:Selecting one RadioButton value and scrolling back removing the selected one in RecyclerView选择一个 RadioButton 值并向后滚动删除 RecyclerView 中的选定值
【发布时间】:2015-12-14 12:17:25
【问题描述】:

在我的应用程序中,我在 RecyclerView 的帮助下显示了 20 个多项选择题。

如果我更改第一个 RadioGroup 的值并向下滚动,再次向上滚动删除 RecycelarView 中的选定值,并且我想进一步使用选定的 RadioButton 值,我也检查了 link1 但是我不明白他在做什么。

这是我的示例代码 sn-p 如果您需要任何说明,请告诉我。

    package com.testing.survey;

import java.util.List;

import android.annotation.SuppressLint;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
import android.widget.TextView;

@SuppressWarnings("rawtypes")
public class DataAdapter extends RecyclerView.Adapter<DataAdapter.ViewHolder> {

    private List<Student> stList;

    public DataAdapter(List<Student> students) {
        this.stList = students;
    }

    // Create new views
    @Override
    public DataAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
            int viewType) {
        // create a new view
        View itemLayoutView = LayoutInflater.from(parent.getContext()).inflate(
                R.layout.list_row, null);

        // create ViewHolder

        ViewHolder viewHolder = new ViewHolder(itemLayoutView);

        return viewHolder;
    }

    @SuppressLint("UseValueOf") @Override
    public void onBindViewHolder(ViewHolder viewHolder,int position) {

        final int pos = position;

        viewHolder.tvQuestionNumber.setText(stList.get(position).getQuestionNumber());

        viewHolder.tvQuestion.setText(stList.get(position).getQuestion());

        viewHolder.rbAns1.setText(stList.get(position).getAnswer1());

        viewHolder.rbAns2.setText(stList.get(position).getAnswer2());

        viewHolder.rbAns3.setText(stList.get(position).getAnswer3());

        viewHolder.rbAns4.setText(stList.get(position).getAnswer4());

        viewHolder.rbAns5.setText(stList.get(position).getAnswer4());

        //viewHolder.rgAnswers.clearCheck();

        viewHolder.rgAnswers.check(stList.get(position).getSelectedRadioButtonId());
        viewHolder.rgAnswers.setTag(new Integer(position));


        Log.v("select"+position,stList.get(position).getSelectedRadioButtonId()+"");

        viewHolder.rgAnswers.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                // TODO Auto-generated method stub
                int radioButtonID = group.getCheckedRadioButtonId();
                View radioButton = group.findViewById(radioButtonID);
                int clickedPos = ((Integer)group.getTag()).intValue(); 

                //Student contact=(Student)group.getTag();

                //contact.setSelectedRadioButtonId(radioButtonID);
                stList.get(clickedPos).setSelectedRadioButtonId(radioButtonID);


                Log.v("hello"+clickedPos,stList.get(clickedPos).getSelectedRadioButtonId()+"");
            }
        });

    }

    // Return the size arraylist
    @Override
    public int getItemCount() {
        return stList.size();
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {

        public TextView tvQuestionNumber;
        public TextView tvQuestion;

        public RadioGroup rgAnswers;
        public RadioButton rbAns1,rbAns2,rbAns3,rbAns4,rbAns5;

        public Student singlestudent;

        public ViewHolder(View itemLayoutView) {
            super(itemLayoutView);

            tvQuestionNumber = (TextView) itemLayoutView.findViewById(R.id.tvQuestionNumber);

            tvQuestion = (TextView) itemLayoutView.findViewById(R.id.tvQuestion);
            rgAnswers=(RadioGroup)itemLayoutView.findViewById(R.id.rgAnswers);
            rbAns1=(RadioButton)itemLayoutView.findViewById(R.id.rbAnswer1);
            rbAns2=(RadioButton)itemLayoutView.findViewById(R.id.rbAnswer2);
            rbAns3=(RadioButton)itemLayoutView.findViewById(R.id.rbAnswer3);
            rbAns4=(RadioButton)itemLayoutView.findViewById(R.id.rbAnswer4);
            rbAns5=(RadioButton)itemLayoutView.findViewById(R.id.rbAnswer5);

        }

    }

    // method to access in activity after updating selection
    public List<Student> getStudentist() {
        return stList;
    }

}

【问题讨论】:

  • 类似这样的事情,如果您选择第一个单选按钮,它会在您向下滚动时自动选择另一个单选按钮。对吗?
  • 是的,你能帮忙解决一下吗
  • 我没有使用 RecyclerView 但我已经使用 setTag 和 getTag 实现了 ViewHolders
  • 我已经更改了我的代码,你能再看看并建议我解决方案
  • viewHolder.rgAnswers.setOnCheckedChangeListener...之后移动viewHolder.rgAnswers.check...有帮助吗?

标签: android android-recyclerview


【解决方案1】:

出现此问题的原因是 RecyclerView 或 Android SDK 中的某个位置存在错误。无论如何,我从另一个 SO 问题中得到了建议 - onCheckedChanged called automatically

对于RadioGroup,会有些不同。有两种方法可以解决。我推荐第一个,因为它是即插即用的。

  1. RadioGroup 上设置OnCheckedChangeListener

    mRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(RadioGroup group, int checkedId) {
            if(checkedId == -1) {
                Log.v("onCheck", "Android bug since RadioButton doesn't get unchecked normally!");
            }
            else {
                Log.v("onCheck", "Valid click. By user");
                mMyListObjectArr[position].setChecked(checkedId);
            }
        }
    });
    
  2. 或在RadioGroup 内的所有RadioButtons 上设置onCheckedChangeListener

    CompoundButton.OnCheckedChangeListener onCheckedChangeListener = new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if(buttonView.isPressed()) {
                Log.v("onCheck", position + ", valid click by user");
                mMyListObjectArr[position].setChecked(buttonView.getId());
            }
            else {
                Log.v("onCheck", "Android bug");
            }
        }
    };
    mRadioButton1.setOnCheckedChangeListener(onCheckedChangeListener);
    mRadioButton2.setOnCheckedChangeListener(onCheckedChangeListener);
    

【讨论】:

  • hmmm mMyListObjectArr[position] 是什么我尝试使用我的 private List&lt;Exam&gt; mExam; 例如 mExam[position].setChecked(buttonView.getId()); 但它说需要数组,找到列表。我怎样才能把它变成一个数组?
  • @Woppi 正如它所说,你提供了一个 List 它需要一个数组。
  • @Woppi 你知道数组中的项目可以使用anArray[position] 获取,而List 中的项目可以使用aList.get(position) 获取。你会在这里做类似的事情。而mMyListObjectArr 是您在RecyclerView 中显示的对象列表。所以基本上它是 OP 的问题中的List&lt;Student&gt; stList
【解决方案2】:

将您的onBindViewHolder() 修改为此

public void onBindViewHolder(ViewHolder viewHolder, int position) {

        final int pos = position;

        viewHolder.tvQuestionNumber.setText(stList.get(position).getQuestionNumber() + "");

        viewHolder.tvQuestion.setText(stList.get(position).getQuestion());

        viewHolder.rbAns1.setText(stList.get(position).getAnswer1());

        viewHolder.rbAns2.setText(stList.get(position).getAnswer2());

        viewHolder.rbAns3.setText(stList.get(position).getAnswer3());

        viewHolder.rbAns4.setText(stList.get(position).getAnswer4());

        viewHolder.rbAns5.setText(stList.get(position).getAnswer5());

        //viewHolder.rgAnswers.clearCheck();

        viewHolder.rgAnswers.setTag(position);


        Log.v("select" + position, stList.get(position).getSelectedRadioButtonId() + "");

        viewHolder.rgAnswers.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                // TODO Auto-generated method stub
                int radioButtonID = group.getCheckedRadioButtonId();
                View radioButton = group.findViewById(radioButtonID);
                int clickedPos = (Integer) group.getTag();


               stList.get(clickedPos).setSelectedRadioButtonId(radioButtonID);

               // if you want to get selected button's info such as tag, text... etc.
                RadioButton radioButton = (RadioButton) viewHolder.itemView.findViewById(radioButtonID);

                if(radioButton != null) {
                    String customTag = radioButton.getTag().toString();
                    stList.get(clickedPos).setCustomTag(customTag);
                }


                Log.v("hello" + clickedPos, stList.get(clickedPos).getSelectedRadioButtonId() + "");
            }
        });

        viewHolder.rgAnswers.check(stList.get(position).getSelectedRadioButtonId());

    }

它应该工作。如果有任何问题,请告诉我。

【讨论】:

  • 感激不尽!这对我有用。你拯救了这一天! :)
  • 在这里,如何获取特定单选按钮的标签。当我尝试RadioButton rb=(RadioButton) viewHolder.rgAnswers.findViewById(radioButtonID); Log.d("TRACE", "radio button id" + radioButton.getText()); 时,我得到了android.widget.RadioButton.getText()' on a null object reference
  • viewHolder.itemView.findViewById(radioButtonID) ,像这样你需要做的。
  • hmmmm 同样的错误。当我从查看器中获取标签或文本时,不会出现此错误。当我将侦听器移动到 onBindViewHolder 以解决回收器视图检查状态问题时......它返回空引用。这是我的代码:gist.github.com/arvi/42d0922bc994e240c6190e30fb1882e3
  • 你可以试试group.findViewById()吗?
【解决方案3】:

我创建了一个示例代码,可以根据您的要求工作。

首先,我们必须按如下方式创建 xml:

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.RecyclerView
    android:id="@+id/recyclerViewAppList"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</LinearLayout>

然后我们将创建如下界面

public interface OnOptionSelected {
public void onOptionSelected(int position,int itemSelected);
}

然后我们将创建模型类如下:

public class QuestionModel {

private String question;
private int seleectedAnswerPosition;
private boolean op1Sel,op2Sel,op3Sel; // options 

public boolean isOp1Sel() {
    return op1Sel;
   }

public void setOp1Sel(boolean op1Sel) {
    this.op1Sel = op1Sel;
    if(op1Sel){ // To make sure only one option is selected at a time
        setOp2Sel(false);
        setOp3Sel(false);
    }
   }

    public boolean isOp2Sel() {
      return op2Sel;
   }

   public void setOp2Sel(boolean op2Sel) {
    this.op2Sel = op2Sel;
    if(op2Sel){
        setOp1Sel(false);
        setOp3Sel(false);
     }
      }

 public boolean isOp3Sel() {
    return op3Sel;
     }

 public void setOp3Sel(boolean op3Sel) {
    this.op3Sel = op3Sel;
    if(op3Sel){
        setOp2Sel(false);
        setOp1Sel(false);
     }
    }

    public int getSeleectedAnswerPosition() {
    return seleectedAnswerPosition;
    }

  public void setSeleectedAnswerPosition(int seleectedAnswerPosition) {
    this.seleectedAnswerPosition = seleectedAnswerPosition;
   }

  public String getQuestion() {
    return question;
  }
 public void setQuestion(String question) {
    this.question = question;
  }
     } 

然后我们将为行创建视图:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/question"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

    <RadioButton
        android:id="@+id/radoptionOne"
        android:text="May Be"
        android:checked="false"
        android:saveEnabled="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <RadioButton
        android:checked="false"
        android:id="@+id/radoptionTwo"
        android:text="NO"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <RadioButton
        android:checked="false"
        android:id="@+id/radoptionThree"
        android:text="Yes"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
   </LinearLayout>

适配器类如下:

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

   private List<QuestionModel> questionModels;


public void setOnOptionSelected(OnOptionSelected onOptionSelected) {
    this.onOptionSelected = onOptionSelected;
}

private OnOptionSelected onOptionSelected;


public List<QuestionModel> getQuestionModels() {
    return questionModels;
}

public void setQuestionModels(List<QuestionModel> questionModels) {
    this.questionModels = questionModels;
}

public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    TextView question;
    RadioGroup radioGroup;
    RadioButton op1, op2, op3;

    ViewHolder(View view) {
        super(view);
        question = (TextView) view.findViewById(R.id.question);
        //radioGroup=(RadioGroup)view.findViewById(R.id.radGroup);
        op1 = (RadioButton) view.findViewById(R.id.radoptionOne);
        op2 = (RadioButton) view.findViewById(R.id.radoptionTwo);
        op3 = (RadioButton) view.findViewById(R.id.radoptionThree);
        op1.setOnClickListener(this);
        op2.setOnClickListener(this);
        op3.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.radoptionOne:
                onOptionSelected.onOptionSelected(getAdapterPosition(), 1);
                break;

            case R.id.radoptionTwo:
                onOptionSelected.onOptionSelected(getAdapterPosition(), 2);
                break;

            case R.id.radoptionThree:
                onOptionSelected.onOptionSelected(getAdapterPosition(), 3);
                break;
        }
    }
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v;
    // create a normal view
    v = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.row_view, parent, false);
    return new ViewHolder(v);

}

@Override
public void onBindViewHolder(ViewHolder viewHolder, final int position) {
    viewHolder.question.setText(questionModels.get(position).getQuestion());

    Log.e("POSITION" + position, "1" + questionModels.get(position).isOp1Sel());

    Log.e("POSITION" + position, "2" + questionModels.get(position).isOp2Sel());
    Log.e("POSITION" + position, "3" + questionModels.get(position).isOp3Sel());


    viewHolder.op1.setChecked(questionModels.get(position).isOp1Sel());
    viewHolder.op2.setChecked(questionModels.get(position).isOp2Sel());
    viewHolder.op3.setChecked(questionModels.get(position).isOp3Sel());


}

@Override
public int getItemCount() {
    if (questionModels != null) {
        return questionModels.size();
    }
    return 0;
}
}

然后是Activity类:

public class MainActivity extends Activity implements OnOptionSelected{

private RecyclerView mRecyclerView;
private List<QuestionModel> questionModels;
private  QuestionAdapter questionAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mRecyclerView =(RecyclerView)findViewById(R.id.recyclerViewAppList);
    mRecyclerView.setHasFixedSize(true);
    questionModels=new ArrayList<QuestionModel>();
    for (int i=0;i<20;i++)
    {
        QuestionModel questionModel=new QuestionModel();
        questionModel.setQuestion("Question " + (i + 1));
        questionModels.add(questionModel);
    }
    questionAdapter =new QuestionAdapter();
    questionAdapter.setOnOptionSelected(this);
    LinearLayoutManager layoutManager = new LinearLayoutManager(this);
    layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
    questionAdapter.setQuestionModels(questionModels);
    mRecyclerView.setLayoutManager(layoutManager);
    mRecyclerView.setAdapter(questionAdapter);
}


@Override
public void onOptionSelected(int position, int itemSelected) {
    questionModels.get(position).setSeleectedAnswerPosition(itemSelected);
    switch (itemSelected){
        case 1:
            questionModels.get(position).setOp1Sel(true);
            break;

        case 2:
            questionModels.get(position).setOp2Sel(true);
            break;
        case 3:
            ((QuestionModel)questionModels.get(position)).setOp3Sel(true);
            break;
    }
    questionAdapter.setQuestionModels(questionModels);
    questionAdapter.notifyDataSetChanged();
   // mRecyclerView.setAdapter(questionAdapter);

}
 }

我尝试了 Radiogroup 的解决方案,但它无法正常工作(有时它会保留旧值)。然后我在我的模型类中改变了选择选项的方式。

【讨论】:

    【解决方案4】:

    你可以这样做.....

    在你的 bean 类中添加一个字段

    String final_answer;
    public String getFinalAnswer(){
      return final_answer;
    }
    
    public void setFinalAnswer(String final_answer){
      this.final_answer = final_answer;
    }
    

    在适配器中.....

    public void onBindViewHolder(final ViewHolder viewHolder, final int position) {
    
        final Student student = stList.get(position);
    
        viewHolder.tvQuestionNumber.setText(student.getQuestionNumber());
    
        viewHolder.tvQuestion.setText(student.getQuestion());
    
        viewHolder.rbAns1.setText(student.getAnswer1());
    
        viewHolder.rbAns2.setText(student.getAnswer2());
    
        viewHolder.rbAns3.setText(student.getAnswer3());
    
        viewHolder.rbAns4.setText(student.getAnswer4());
    
        viewHolder.rbAns5.setText(student.getAnswer4());
    
        viewHolder.rgAnswers.clearCheck();
    
       if(student.getSelectedRadioButtonId()!=null)
         viewHolder.rgAnswers.check(student.getSelectedRadioButtonId());
       else
         viewHolder.rgAnswers.clearCheck();
    
        viewHolder.rgAnswers.setOnCheckedChangeListener(new OnCheckedChangeListener() {
    
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
              if(checkedId != -1){
                student.setSelectedRadioButtonId(checkedId);
                RadioButton rb = (RadioButton)viewHolder.rgAnswers.
                                      findViewById(checkedId);
    
                student.setFinalAnswer(rb.getText);
                stList.get(position) = student;
              }
            }
        });
    }
    

    要最终获得选定的答案...在主要活动中编写此代码

      public void getSelectedAnswers(){
    
           for(int i=0;i<slist.length;i++){
              //get selected answer
              Log.i("answer",slist.get(i).getFinalAnswer());
           }
        }
    

    【讨论】:

    • 如果我向下滚动第 7 个和第 8 个答案会根据第 1 个和第 2 个答案自动选择,这会出现问题,我们该如何解决这个问题。我还分享了 git 链接,您可以在那里查看代码。 github.com/saikrupa/Survay
    • 但不是每次它选择几次时,我只更改了您当前代码中的 1 行文本,即 (stList.get(position).add(student);) 而不是 stList.get(position) = student;,并且我也被添加到大师班 @987654327 @
    【解决方案5】:

    问题在于回收器视图正在回收(如名称所示)您的视图。

    系统会创建一定数量的 ViewHolders 来填充您的屏幕,在达到该数量后它会重复使用已经存在的 ViewHolders。

    如果您在第一个列表条目中设置了选中的按钮,并且它为您的第 7 个列表条目重用了 ViewHolder,则该按钮仍处于选中状态(因为它已在 ViewHolder 中设置)。

    要解决此问题,您需要每次在 onBindViewHolder 中为您的侦听器设置默认外观。

    更新:

    public void onBindViewHolder(final ViewHolder viewHolder, final int position) {
    
        final Student student = stList.get(position);
    
        viewHolder.tvQuestionNumber.setText(student.getQuestionNumber());
    
        viewHolder.tvQuestion.setText(student.getQuestion());
    
        viewHolder.rbAns1.setText(student.getAnswer1());
    
        viewHolder.rbAns2.setText(student.getAnswer2());
    
        viewHolder.rbAns3.setText(student.getAnswer3());
    
        viewHolder.rbAns4.setText(student.getAnswer4());
    
        viewHolder.rbAns5.setText(student.getAnswer4());
    
        viewHolder.rgAnswers.clearCheck();
    
        viewHolder.rgAnswers.check(student.getSelectedRadioButtonId());
    
        viewHolder.rgAnswers.setOnCheckedChangeListener(new OnCheckedChangeListener() {
    
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                student.setSelectedRadioButtonId(checkedId);
                Log.v("hello"+position,checkedId+"");
            }
        });
    }
    

    我稍微更新了你的新方法,也许这有帮助?

    【讨论】:

    • 我不确定这会有什么帮助,您将所有按钮都设置为未选中。如果用户选中一个向下滚动然后返回,您将需要重置原始选中状态而不是全部取消选中。 Furthur,你在用setTag()做什么,看着文档似乎完全不相关:developer.android.com/intl/ru/reference/android/view/…, java.lang.Object)
    • 我以上述方式更改了我的代码,请看看它仍然遇到同样的问题
    • 我再次更新了我的anwser,如果您仍然有问题,如果您能提供有关问题的更多信息(例如屏幕截图)会很好。
    • upVoted 但一旦检查编辑的代码,答案就没有用了
    【解决方案6】:

    正如我看到你的代码...

    只添加一行

    viewHolder.rgAnswers.setOnCheckedChangeListener(null);

    onBindViewHolder()方法上面这一行

    viewHolder.rgAnswers.check(stList.get(position).getSelectedRadioButtonId()); ...

    如果它解决了您的问题......请告诉我...... 我将向您解释为什么会发生这种情况.. 因为我遇到了 类似的问题并使用此解决方案解决了。

    【讨论】:

    • 那么我如何存储选择的答案。
    • 我认为您将选定的答案存储在onCheckChangedListner()
    • 是的,我只将答案存储在onCheckChangedListner()
    • @Woppi,如果 Readio 按钮上发生任何操作选择要存储在 pojo 类中的值,那么我在 pojo 类的帮助下解决了我的问题,然后您稍后再检索它
    【解决方案7】:

    在你的模型类中添加

    private int checkedId = -1;
    
    public int getCheckedId() {
        return checkedId;
    }
    
    public void setCheckedId(int checkedId) {
        this.checkedId = checkedId;
    }
    

    并像这样在适配器中更改 onBindViewHolder:

     @Override
    public void onBindViewHolder(ViewHolder viewHolder, final int position) {
        viewHolder.tvQuestion.setText(stList.get(position).getQuestion());
    
        viewHolder.rbAns1.setText(stList.get(position).getAnswer1());
        viewHolder.rbAns2.setText(stList.get(position).getAnswer2());
        viewHolder.rbAns3.setText(stList.get(position).getAnswer3());
        viewHolder.rbAns4.setText(stList.get(position).getAnswer4());
        viewHolder.rbAns5.setText(stList.get(position).getAnswer5());
    
        viewHolder.radGrp.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
    
            @Override
            public void onCheckedChanged(RadioGroup rgp, int checkedId) {
                // TODO Auto-generated method stub
                stList.get(position).setCheckedId(rgp.getCheckedRadioButtonId());
            }
        });
    
        viewHolder.radGrp.check(stList.get(position).getCheckedId());
    }
    

    【讨论】:

      【解决方案8】:

      在您的学生班级中添加一个布尔变量 isSelected。现在在每个radiogroup 的checkedChangeListener 上,更改isSelected 的值以标记是否已选择某个值或未进行选择。现在在 onBindViewHolder() 里面做

          if(stList.get(position).isSelected){
        viewHolder.rgAnswers.check(stList.get(position).getSelectedRadioButtonId());
          }else{
          viewHolder.rgAnswers.clearCheck();
          }
      

      最后,您可以遍历整个列表并检查 isSelected 为 true 的对象

      【讨论】:

        【解决方案9】:

        RecyclerView 超越了 ListView 及其主要属性 它在上下滚动时重用单元格。 因此,即使您的列表中有大量数据,它也不会在滚动时轻弹。 由于 RecyclerView 中重复使用单元格,您遇到了问题。

        您可以通过使用 getter 和 setter 方法将 RecyclerView 列表数据绑定到 Modal 类来克服这个问题。 您可以根据单元格位置和相应数据显示选中或未选中的checkbox。 在我的示例中,我使用 setOnClickListener 而不是 setOnCheckedChangeListenerto 来显示选中或未选中的复选框。

        【讨论】:

        • 它非常适合复选框,但我们在我为 radioButton 实现它时遇到了这个问题
        • 您也可以对单选按钮使用相同的场景。
        【解决方案10】:

        嗯,大多数开发人员一次又一次地重新注册监听器的主要问题代码。

        • 所以最重要的一点是不要在 onBindViewHolder 中注册监听器
        • 第二个重点是通过有效的方式设置标签来解决它,因此不要在标签中保存大对象,所以我们只会保存位置。

        在我的例子中,我在一个位于 list_item 布局中的组中有四个单选按钮:

        override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
                val question = questions[position]
                holder.questionNumberTextView.text = "" + question.id + "."
                holder.questionTextView.text = question.question
                holder.myRadioGroup.tag = position
                if (question.selectedRadioButtonId != -1) {
                    holder.myRadioGroup.check(question.selectedRadioButtonId);
                } else {
                    //your always need to write else condition
                    holder.myRadioGroup.clearCheck();
                }
        }
        
         override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
            var itemLayoutView = LayoutInflater.from(parent.context)
                .inflate(R.layout.list_item, parent, false)
        
            val myViewHolder = MyViewHolder(itemLayoutView)
            myViewHolder.myRadioGroup.setOnCheckedChangeListener { radioGroup, radioButtonId ->
                val clickedPos = radioGroup.tag as Int
                Log.i("MyAdapter", "clicked pos:: $clickedPos  radioButtonId :: $radioButtonId")
                questions[clickedPos].selectedRadioButtonId = radioButtonId
            }
            return myViewHolder
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-04-05
          • 2022-06-26
          • 1970-01-01
          • 2012-02-29
          • 2022-01-05
          • 1970-01-01
          • 2011-08-05
          相关资源
          最近更新 更多