2017-01-24 2 views
0

J'utilise RxBinding pour gérer la recherche dans mon application. Comment obtenir le résultat en tant que liste des articles? toList().toBlocking().single() n'est pas une option dans le flux infini car ne sera jamais appelée. Des idées? Merci.Transformer la séquence de T en Liste <T> dans un flux infini

RxSearchView.queryTextChanges(searchView) 
        .filter(queryString -> queryString.length() > 3 || queryString.length() == 0) 
        .debounce(500, TimeUnit.MILLISECONDS) 
        .map(CharSequence::toString) 
        .flatMap(s -> Observable.from(fishPlaces) 
              .filter(fishPlace -> fishPlace.getName().toLowerCase().contains(s.toLowerCase()))) 
        .subscribe(fishPlace -> { **// HOW TO GET A LIST<FISHPLACE> HERE???** }, throwable -> {}); 

Répondre

1

Ce que je suppose que vous êtes est après la liste des " fishPlaces "qui correspond à une chaîne de recherche spécifique.

Je devine aussi que le nombre de "fishPlaces" est fini, puisqu'il n'aurait pas de sens d'en faire une liste autrement.

Avec des modifications mineures (sans réellement l'exécution du code), je suppose que les éléments suivants travailleraient:

RxSearchView.queryTextChanges(searchView) 
        .filter(queryString -> queryString.length() > 3 || queryString.length() == 0) 
        .debounce(500, TimeUnit.MILLISECONDS) 
        .map(CharSequence::toString) 
        .map(s -> Observable.from(fishPlaces) 
             .filter(fishPlace -> fishPlace.getName().toLowerCase().contains(s.toLowerCase())) 
             .toList().toBlocking().single()) 
        .subscribe(fishPlaces -> { /* Go fishing! */ }, throwable -> {}); 
+0

Cela fonctionne. Je vous remercie. – lordmegamax

1

L'observable à l'intérieur de votre flatmap peut cependant être rendu bloquant. Vous pouvez donc simplement map() au lieu de flatmap() et faire le toList() sur l'observable des fishplaces.

.map (s -.> Observable.from (fishPlaces) .filter (FP-> foo (s, Fp)) toList()))

+0

Il fonctionne. Je vous remercie. – lordmegamax