2016-11-16 52 views
1

我正在使用Rxbinding库来检测文本视图上的点击和文本在编辑框中的变化。我需要有任何一个TextView点击或一个非空的编辑框和检测,我使用combinelatest运算符对两个观测如下:CombineLatest与RxView.clicks

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的) 声明-1未被调用,但仅调用声明-3被调用。但每当我在vProjectBudget(EditText),Statement-2以及中输入文本时,总是会调用声明-3。有人可以帮助我了解我在这里做错了什么。

回答

1

添加.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

相关问题