2016-12-02 6 views
0

J'utilise RxSearchView pour interroger les changements de texte dans une forme de « recherche que vous tapez »RxSearchView observer textChanges et événements en même temps

RxSearchView.queryTextChanges(searchView) 

mais je voudrais attraper aussi lorsque l'utilisateur soumet la recherche, donc je dois utiliser

RxSearchView.queryTextChangeEvents(searchView) ou searchView.setOnQueryTextListener

Lorsque j'utilise l'un de ces deux derniers, on dirait qu'ils annulent la première RxSearchView.queryTextChanges, ressemble qu'il ne peut y avoir 1 obse rvable attaché à SearchView.

Comment puis-je observer les deux événements en même temps?

Voici le code complet

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) { 
      } 


     }); 
    } 

Répondre

1

Il n'y a qu'un seul observable car il remplace l'auditeur de la vue, mais vous pouvez utiliser RxSearchView.queryTextChangeEvents(searchView) pour surveiller les deux types d'événements. Il donne un flux de SearchViewQueryTextEvent événements. Pour chaque événement, vous pouvez vérifier isSubmitted() pour déterminer s'il s'agit d'une soumission ou d'un événement de modification et récupérer le texte en cours avec queryText().

Voici comment pourrait utiliser ConnectableObservable pour obtenir les événements dans deux cours d'eau pour filtrer séparément -

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

Je viens mis à jour la réponse avec le code complet, mais la chose est que l'anti-rebond et throttleLast également une incidence sur la recherche avec le soumettre et j'espérais les séparer –

+0

il y a aussi cet exemple https://github.com/kmdupr33/iosched/blob/feature/rxjava_rewrite/android/src/main/java/com/google/samples/apps /iosched/ui/SearchActivity.java mais je ne trouve pas la classe DelegatingOnQueryTextListener.java pour la tester –

+0

@JavierVargas Si vous avez besoin de plusieurs abonnements, jetez un oeil à 'ConnectableObservable's (https: // gi thub.com/ReactiveX/RxJava/wiki/Connectable-Observable-Operators). Vous pouvez ensuite filtrer chaque flux séparément. – iagreen