RadioButtons 自动检查 RecyclerView 滚动而不点击
RadioButtons auto checked on RecyclerView scrolling without clicking
我正在开发一个模型测试应用程序,其中每个测试有 20 个问题,每个问题在一个单选组中有 4 个单选按钮选项。
现在在滚动和选择单选按钮时,我遇到了自动单选按钮检查。
我想知道为什么会出现这个问题以及解决方法。
这是我的 RecylerView 示例代码。
`
@Override
public void onBindViewHolder(@NonNull QuizQuestionViewHolder holder, int position) {
final QuestionsWithOption questionsWithOption = questionsWithOptionList.get(position);
final List<Option> optionList = questionsWithOption.getOptions();
holder.quizQuestionTextView.setText(questionsWithOption.getTitle());
if (holder.quizOptionsRadioGroup.getChildCount() == 0) {
addRadioButtons(holder.quizOptionsRadioGroup, optionList,
questionsWithOption.getId());
}
}
private void addRadioButtons(RadioGroup quizOptionsRadioGroup,
List<Option> optionList, final int questionId) {
final RadioButton[] radioButtons = new RadioButton[optionList.size()];
for(int i = 0; i < optionList.size(); i++){
radioButtons[i] = new RadioButton(context);
radioButtons[i].setText(optionList.get(i).getName());
radioButtons[i].setTextSize(14);
radioButtons[i].setId(optionList.get(i).getId());
radioButtons[i].setTag(optionList.get(i));
radioButtons[i].setPadding(8, 8, 8, 8);
quizOptionsRadioGroup.addView(radioButtons[i]);
}
quizOptionsRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
RadioButton checkedRadioButton = group.findViewById(checkedId);
Option quizOptions = (Option) checkedRadioButton.getTag();
Log.d("Checked", quizOptions.getName());
}
});
}
这是我的应用程序的屏幕截图。这些单选按钮在滚动后会自动检查。我没有按任何按钮。
`
嗯,这是关于 recyclerview 的一些有趣的事情。当您更改单选按钮的选中状态时,onBindView 函数将作为 recycler.So 一次又一次地被调用,其他视图单选按钮也会在它们利用引用时发生变化。
解决方案是始终检查在 onBindView 函数中选中和取消选中单选按钮的必要条件
将以下代码添加到您的适配器 class,这可能会有所帮助:
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemViewType(int position) {
return position;
}
我正在开发一个模型测试应用程序,其中每个测试有 20 个问题,每个问题在一个单选组中有 4 个单选按钮选项。
现在在滚动和选择单选按钮时,我遇到了自动单选按钮检查。
我想知道为什么会出现这个问题以及解决方法。 这是我的 RecylerView 示例代码。 `
@Override
public void onBindViewHolder(@NonNull QuizQuestionViewHolder holder, int position) {
final QuestionsWithOption questionsWithOption = questionsWithOptionList.get(position);
final List<Option> optionList = questionsWithOption.getOptions();
holder.quizQuestionTextView.setText(questionsWithOption.getTitle());
if (holder.quizOptionsRadioGroup.getChildCount() == 0) {
addRadioButtons(holder.quizOptionsRadioGroup, optionList,
questionsWithOption.getId());
}
}
private void addRadioButtons(RadioGroup quizOptionsRadioGroup,
List<Option> optionList, final int questionId) {
final RadioButton[] radioButtons = new RadioButton[optionList.size()];
for(int i = 0; i < optionList.size(); i++){
radioButtons[i] = new RadioButton(context);
radioButtons[i].setText(optionList.get(i).getName());
radioButtons[i].setTextSize(14);
radioButtons[i].setId(optionList.get(i).getId());
radioButtons[i].setTag(optionList.get(i));
radioButtons[i].setPadding(8, 8, 8, 8);
quizOptionsRadioGroup.addView(radioButtons[i]);
}
quizOptionsRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
RadioButton checkedRadioButton = group.findViewById(checkedId);
Option quizOptions = (Option) checkedRadioButton.getTag();
Log.d("Checked", quizOptions.getName());
}
});
}
这是我的应用程序的屏幕截图。这些单选按钮在滚动后会自动检查。我没有按任何按钮。
`
嗯,这是关于 recyclerview 的一些有趣的事情。当您更改单选按钮的选中状态时,onBindView 函数将作为 recycler.So 一次又一次地被调用,其他视图单选按钮也会在它们利用引用时发生变化。
解决方案是始终检查在 onBindView 函数中选中和取消选中单选按钮的必要条件
将以下代码添加到您的适配器 class,这可能会有所帮助:
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemViewType(int position) {
return position;
}