CombineLatest与RxView.clicks

时间:2016-11-16 06:31:48

标签: android rx-java rx-binding

我正在使用Rxbinding库来检测文本视图中的点击和编辑框中的文本更改。我需要点击一个textview或一个非空的编辑框,并检测我在两个observable上使用combinelatest运算符,如下所示:

Observable<Void> obsPriceOnReq = RxView.clicks(vPriceOnReq).asObservable();
    obsPriceOnReq.subscribe(new Action1<Void>() {
        @Override
        public void call(Void aVoid) {
            mPriceOnReqBool = !mPriceOnReqBool; // Statement-1
            // Do some work here.
    });


Observable<String> obsBudget = RxTextView.textChanges(vProjectBudget).map(charseqToStr);
    obsBudget.subscribe(new Action1<String>() {
        @Override
        public void call(String s) {
            mBudgetFilledBool = checkPosDouble(s); // Statement-2
        }
    });

Observable.combineLatest(obsPriceOnReq, obsBudget, new Func2<Void, String, Boolean>() {
        @Override
        public Boolean call(Void aVoid, String s) {
            return mBudgetFilledBool || mPriceOnReqBool; // Statement-3
        }
    }).subscribe(new Action1<Boolean>() {
        @Override
        public void call(Boolean aBoolean) {
            // Do some work here
        }
    });

问题是每当我点击 vPriceOnReq (TextView)时, Statement-1 未被调用,但只调用 Statement-3 。但每当我在 vProjectBudget (EditText)中输入文本时,始终会调用 Statement-2 以及 Statement-3 。有人可以帮我理解我在这里做错了什么。

1 个答案:

答案 0 :(得分:2)

.replay(1).refCount()添加到obsPriceOnReq的末尾 所以你会:

Observable<Void> obsPriceOnReq = RxView.clicks(vPriceOnReq)
    .asObservable()
    .replay(1)
    .refCount();

并使用obsPriceOnReq.withLatestFrom(obsBudget, new Func2<>...)代替.combineLatest()它会让您的应用仅对点击做出反应,并从obsBudget获取最新项目。 About click based events in RxJava