我有 5 个复选框,并使用 RxBinding 检查所有复选框的状态。
预期的逻辑(变量名以'cb'开头是复选框,以'btn'开头是按钮)
- 如果选中/取消选中 cbAgreeAll,则 cbOption1~cbOption4 设置与 cbAgreeAll 相同的状态。
- 如果 cbOption1~cbOption4 全部选中,则 cbAgreeAll 也设置为选中。
- 如果一个或多个复选框未选中,则 cbAgreeAll 也设置为未选中。
- 如果勾选了cbOption1、cbOption2,则btnNext Button setEnabled(true)
第一个和第二个逻辑像我预期的那样工作,但是当所有复选框都被选中时,我取消选中 cbOption1~cbOption4 之一,然后所有复选框都被取消选中。和 4 也没有工作。
我的代码如下所示,
Disposable cbAgreeallDisposable = RxCompoundButton.checkedChanges(binding.cbAgreeall).subscribe(check -> {
isAllAgree = check;
binding.cbOption1.setChecked(check);
binding.cbOption2.setChecked(check);
binding.cbOption3.setChecked(check);
binding.cbOption4.setChecked(check);
});
Observable<Boolean> cbOption1 = RxCompoundButton.checkedChanges(binding.cbOption1);
Observable<Boolean> cbOption2 = RxCompoundButton.checkedChanges(binding.cbOption2);
Observable<Boolean> cbOption3 = RxCompoundButton.checkedChanges(binding.cbOption3);
Observable<Boolean> cbOption4 = RxCompoundButton.checkedChanges(binding.cbOption4);
compositeDisposable.add(cbAgreeallDisposable);
compositeDisposable.add(cbOption1.subscribe(check -> isOption1Agree = check));
compositeDisposable.add(cbOption2.subscribe(check -> isOption2Agree = check));
compositeDisposable.add(cbOption3.subscribe(check -> isOption3Agree = check));
compositeDisposable.add(cbOption4.subscribe(check -> isOption4Agree = check));
compositeDisposable.add(Observable
.combineLatest(cbOption1, cbOption2,
(cb1, cb2) -> cb1 && cb2)
.subscribe(isValid -> binding.btnNext.setEnabled(isValid))
);
compositeDisposable.add(Observable
.combineLatest(cbOption1, cbOption2, cbOption3, cbOption4,
(cb1, cb2, cb3, cb4) -> cb1 && cb2 && cb3 && cb4)
.subscribe(isValid -> binding.cbAgreeall.setChecked(isValid)
));