我有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;
}
}
谢谢你帮我
最佳答案
在您的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操作。