3 votes

Android, RXJava, recherche en utilisant debounce

Je suis en train d'utiliser debounce() pour gérer la recherche de l'utilisateur et traiter sa pause pendant la saisie (effectue les recherches 1 seconde après la saisie du dernier caractère) :

RxSearchView.queryTextChanges(searchView)
            .debounce(1, TimeUnit.SECONDS)
            .subscribe(new Action1() {
                @Override
                public void call(CharSequence charSequence) {
                    presenter.loadUsers(charSequence.toString());
                }
            });

donc si l'utilisateur supprime tous les caractères, il attend 1 seconde puis charge la liste, comment puis-je gérer cela et charger la liste instantanément ?

5voto

R. Zagórski Points 13234

Dans votre cas, seul l'opérateur debounce avec des paramètres différents est nécessaire :

public final Observable debounce(Func1> debounceSelector)

En l'utilisant, vous pouvez filtrer les événements qui peuvent être retardés ou non :

RxSearchView.queryTextChanges(searchView)  
    .debounce(new Func1>() {
        @Override
        public Observable call(CharSequence charSequence) {
            if (charSequence.length() == 0) {
                return Observable.empty();
            } else {
                return Observable.empty().delay(1, TimeUnit.SECONDS);
            }
        }
    })
    .subscribe(new Action1() {
        @Override
        public void call(CharSequence charSequence) {
            Log.d(MainActivity.class.getSimpleName(), new Date().toGMTString() + " " + charSequence.length() + " :" + charSequence);
        }
    });

1voto

miensol Points 1889

Dans sa forme la plus simple, il suffit de fusionner l'observable débouncé avec un déclencheur manuel comme ceci :

RxSearchView.queryTextChanges(searchView)
        .debounce(1, TimeUnit.SECONDS)
        .mergeWith(Observable.just("")) // déclencher manuellement onNext avec une recherche vide
        .subscribe(new Action1() {
            @Override
            public void call(CharSequence charSequence) {
                presenter.loadUsers(charSequence.toString());
            }
        });

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X