2016-12-02 8 views
0

я использую RxSearchView для запроса изменения текста в форме «Поиск при вводе»RxSearchView наблюдения textChanges и события в то же время

RxSearchView.queryTextChanges(searchView) 

, но я хотел бы также поймать, когда пользователь отправляет поиск, поэтому я должен использовать

RxSearchView.queryTextChangeEvents(searchView) или searchView.setOnQueryTextListener

При использовании любого из этих последних 2, похоже, они отменяют первый RxSearchView.queryTextChanges, похоже, что может быть только 1 OBSE rvable, прикрепленный к SearchView.

Как я могу наблюдать за обоими событиями одновременно?

Вот полный код

private void setupSearch() { 
     RxSearchView.queryTextChangeEvents(searchView) 
       .skip(1) 
       .throttleLast(100, TimeUnit.MILLISECONDS) 
       .debounce(200, TimeUnit.MILLISECONDS) 
       .onBackpressureLatest() 
       .observeOn(AndroidSchedulers.mainThread()) 
       .filter(new Func1<SearchViewQueryTextEvent, Boolean>() { 
        @Override 
        public Boolean call(SearchViewQueryTextEvent searchViewQueryTextEvent) { 
         final boolean empty = TextUtils.isEmpty(searchViewQueryTextEvent.queryText()); 
         if (empty) { 
          //Dont show anything clear adapter 
         } 
         return !empty; 
        } 
       }).subscribe(new Subscriber<SearchViewQueryTextEvent>() { 

      @Override 
      public void onNext(SearchViewQueryTextEvent searchViewQueryTextEvent) { 
       String searchTerm = searchViewQueryTextEvent.queryText().toString(); 
       if (searchViewQueryTextEvent.isSubmitted()) { 
        submitFullSearch(searchTerm); 
       } else { 
        submitRecommendationsSearch(searchTerm); 
       } 
      } 

      @Override 
      public void onCompleted() { 
      } 

      @Override 
      public void onError(Throwable e) { 
      } 


     }); 
    } 

ответ

1

Существует только один наблюдаемый, поскольку она переписывает слушатель мнения о, но вы можете использовать RxSearchView.queryTextChangeEvents(searchView) для контроля обоих типов событий. Он дает поток SearchViewQueryTextEvent событий. Для каждого события вы можете проверить isSubmitted(), чтобы определить, является ли это отправкой или событием изменения, и введите текущий текст с помощью queryText().

Вот как можно использовать ConnectableObservable, чтобы получить события на два поток для фильтрации отдельно -

private void setupSearch() { 
    ConnectableObservable<SearchViewQueryTextEvent> searchObs = RxSearchView.queryTextChangeEvents(searchView).publish(); 
    searchObs.skip(1) 
      .throttleLast(100, TimeUnit.MILLISECONDS) 
      .debounce(200, TimeUnit.MILLISECONDS) 
      .onBackpressureLatest() 
      .observeOn(AndroidSchedulers.mainThread()) 
      .filter(new Func1<SearchViewQueryTextEvent, Boolean>() { 
       @Override 
       public Boolean call(SearchViewQueryTextEvent searchViewQueryTextEvent) { 
        final boolean empty = TextUtils.isEmpty(searchViewQueryTextEvent.queryText()); 
        if (empty) { 
         //Dont show anything clear adapter 
        } 
        return !empty; 
       } 
      }).subscribe(new Subscriber<SearchViewQueryTextEvent>() { 

     @Override 
     public void onNext(SearchViewQueryTextEvent searchViewQueryTextEvent) { 
      String searchTerm = searchViewQueryTextEvent.queryText().toString(); 
      if (!searchViewQueryTextEvent.isSubmitted()) { 
       submitRecommendationsSearch(searchTerm); 
      } 
     } 

     @Override 
     public void onCompleted() { 
     } 

     @Override 
     public void onError(Throwable e) { 
     } 
    }); 

    searchObs.subscribe(new Subscriber<SearchViewQueryTextEvent>() { 
     @Override 
     public void onCompleted() { 

     } 

     @Override 
     public void onError(Throwable e) { 

     } 

     @Override 
     public void onNext(SearchViewQueryTextEvent searchViewQueryTextEvent) { 
      if (searchViewQueryTextEvent.isSubmitted()) { 
       submitFullSearch(searchTerm); 
      } 
     } 
    }); 

    Subscription searchSub = searchObs.connect(); 
+0

Я только что обновил ответ с полным кодом, но дело в том, что дребезг и throttleLast будут также влиять на поиск с submit и я надеялся их разделить –

+0

есть также этот пример https://github.com/kmdupr33/iosched/blob/feature/rxjava_rewrite/android/src/main/java/com/google/samples/apps /iosched/ui/SearchActivity.java, но я не могу найти класс DelegatingOnQueryTextListener.java для его проверки. –

+0

@JavierVargas. Если вам нужно несколько подписчиков, посмотрите на 'ConnectableObservable' (https: // gi thub.com/ReactiveX/RxJava/wiki/Connectable-Observable-Operators). Затем вы можете фильтровать каждый поток отдельно. – iagreen