如何检查所有RadioGroup?

时间:2018-10-12 15:04:45

标签: java android radio-group

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

enter image description here

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

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操作。

答案 1 :(得分:0)

此方法返回的布尔值只是最后一个问题的值。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;
}