RadioGroup全部勾选怎么处理?

How Handle If all RadioGroup Checked?

我有 60 个项目的 RecyclerView。 Items 有 RadioGroup 并且在这个里面有两个单选按钮

我也用 DataBinding

我有 FabButton,如果单击此按钮,我将转到结果 Activity 但如果选中所有 RadioGroup :)

我写的是这样的代码,它可以工作,但有一些错误......当我点击第 60 个项目时,甚至不检查 59 个项目,我将转到结果 Activity。

为什么?

这是我的代码:

//Select All Radio Group
public boolean allSelected() {
    boolean allChecked = true;
    for (Question question : questions) {
        allChecked = question.getSelectedId() != 0;
    }
    return allChecked;
}

//Card background if Uncheck the question
private void showHideErrorBackground(boolean show) {
    for (Question question : questions) {
        question.setShowErrorBackground(show);
    }
    mbtiQuestAdapter.notifyDataSetChanged();
}

喜欢它我用这个方法:

if (allSelected()) {

  Intent intent = new Intent(MbtiQuestionActivity.this, ResultActivity.class);

        startActivity(intent);

} else {
        snack bar =
          Snackbar.make(coordinator, R.string.check_all_ques_err, Snackbar.LENGTH_SHORT)

            .setAction(R.string.snack_find_unchecked_ques, new View.OnClickListener() {
              @Override
              public void onClick(View view) {
                showHideErrorBackground(true);
              }
            });

        ViewCompat.setLayoutDirection(snackbar.getView(), ViewCompat.LAYOUT_DIRECTION_RTL);
        snackbar.show();
}

Question.java(模型数据)

public class Question extends BaseQuestion {

  private int selectedId;
  private boolean showErrorBackground;

  @Bindable
  public void setShowErrorBackground(boolean showErrorBackground) {
    this.showErrorBackground = showErrorBackground;
    notifyPropertyChanged(BR.showErrorBackground);
  }

  @Bindable
  public int getSelectedId() {
    return selectedId;
  }

  public void setSelectedId(int selectedId) {
    this.selectedId = selectedId;
    notifyPropertyChanged(BR.selectedId);
  }

  public boolean isShowErrorBackground() {
    return showErrorBackground;
  }
}

谢谢你帮助我

在您的 allSelected 方法中,您直接将变量 allChecked 的值设置为循环中当前问题的选中状态。这意味着只要勾选了最后一个问题,allChecked的值就会变成true。同样,如果未选中,它将始终为 false,但这符合您应用的行为,因此您可能没有遇到任何问题。

相反,您应该使用如下的 AND 运算:

allChecked = allChecked && (question.getSelectedId() != 0);

如果有任何问题未得到解答,您的 for 循环就会中断,您可以通过执行以下操作来优化代码:

for (Question question : questions) {
      if (question.getSelectedId() == 0) {
          allChecked = false;
          break;
      }
}

在这段代码中,一旦遇到未回答的问题,allChecked就会被设置为false,其余的问题将被跳过。您不需要每次迭代都使用 AND 运算。

这个方法返回的布尔值就是最后一个question.getSelectedId()的值。

public boolean allSelected() {
    boolean allChecked = true;
    for (Question question : questions) {
       allChecked = question.getSelectedId() != 0;
    }
    return allChecked;
}

试试这个:

public boolean allSelected() {
    for (Question question : questions) {
        if (question.getSelectedId() == 0)
            return false;
    }
    return true;
}