2016-11-16 3 views
1

Я использую библиотеку Rxbinding для обнаружения щелчков по текстовому виду и текстовым изменениям в блоке редактирования. Мне нужно иметь либо TextView щелкнул или непустой EditBox и обнаружить, что я использую 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), Выписка-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

Смежные вопросы