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