Как обращаться, если все RadioGroup проверены? - PullRequest
0 голосов
/ 12 октября 2018

У меня есть RecyclerView With 60 Item.что элементы имеют RadioGroup, и в этом есть два переключателя

Я использую DataBinding Too

У меня есть 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();
}

и мне нравится этот метод:

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 голосов
/ 12 октября 2018

Логическое значение, возвращаемое этим методом, является просто значением последнего вопроса. 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;
}
0 голосов
/ 12 октября 2018

Внутри вашего 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 на каждой итерации.

...