2017-12-25 7 views
0

私はカスタムボタンを作成しました。内部にチェックされたリスナーがあり、PublishSubjectの助けを借りてオブザーバブルとして公開します。第UIでCompineLatest、マルチプルチェックのボタンを見るRxjava

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

} 

私はこのタイプの複数のボタンを持って、私は彼らの観測のすべてを取得し、任意の変更をリッスンするCompineLatestを使用して、私が達成しようとすると、保存設定を有効にすることであるbutttonかのボタンのいずれかその状態を変えた。

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

は、私が問題に近づくだろう方法は次のとおりです。.distinct()を使用することにより

Observable.merge(button1.distinct(), button2.distinct(), button3.distinct()) 
    .subscribe(ignore -> getView().enableSave(true)); 

を、あなたは変更があった場合にのみ放出するボタンを確保します。 がある値と一致するときに放出する必要がある場合は、.distinct().filter(<Predicate>)となります。

希望すると便利です。