我创建了自定义按钮,它有内部检查的侦听器,并在PublishSubject的帮助下将其公开为observable。
public class SwitchItem extends LinearLayout implements SwitchButton.OnCheckedChangeListener {
//other fields ...
private PublishSubject<Boolean> checkedObservable = PublishSubject.create();
//I call this method in each
private void initViews(String itemTitle, String itemStatus, boolean isChecked) {
//other initializations
if (switchButton != null) {
switchButton.setOnCheckedChangeListener(this);
}
}
@Override
public void onCheckedChanged(SwitchButton view, boolean isChecked) {
defaultItemStatusText(isChecked);
checkedObservable.onNext(isChecked);
}
//to get the observable
public Observable<Boolean> getCheckedObservable() {
return checkedObservable;
}
}
在UI中我有多个这种类型的按钮,我得到了所有的observable并使用CompineLatest来监听任何变化,我试图实现的是如果任何按钮改变其状态,则启用设置保存按钮。
Observable.combineLatest(button1, button2,button3,(cheked1, cheked2, cheked3) -> {
boolean isSettingsChanged = false;
isSettingsChanged = checked1 != inital1 || checked2 != inital2 || checked3 != inital3;
return isSettingsChanged;
}).subscribe(enable -> getView().enableSave(enable));
我必须更改所有按钮状态的问题,以便compineLatest
开始触发其逻辑。我尝试使用setChecked()
为它们提供初始值,但它不起作用,它始终等待触发特定按钮以使其开始工作。我不知道问题出在哪里。
答案 0 :(得分:0)
以下是我如何解决问题:
Observable.merge(button1.distinct(), button2.distinct(), button3.distinct())
.subscribe(ignore -> getView().enableSave(true));
使用.distinct()
,确保按钮仅在发生更改时发出。如果您需要在更改且与某个值匹配时发出,那么您正在查看.distinct().filter(<Predicate>)
。
希望这有帮助