我有60个项目的RecyclerView。该项目具有RadioGroup,并且在此具有两个单选按钮

我也使用DataBinding

我有FabButton,如果单击“是”,我将进入“结果活动”,但是如果所有RadioGroup已选中:)

我写这样的代码,它是可行的,但是有一些错误...当我单击第60个项目时,即使不检查59个项目,我也将进入结果活动。

为什么呢?

这是我的代码:

//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();
}




并且喜欢它,我使用This Method:

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;
  }
}


java - 如何检查所有RadioGroup?-LMLPHP

谢谢你帮我

最佳答案

在您的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操作。

10-04 12:25