Дождитесь, пока пользователь перестанет печатать, прежде чем выполнять интенсивный поиск в searchview
Поиск занимает центральное место в моем приложении, и мне нужно, чтобы он хорошо работал. Прямо сейчас у меня есть SearchView. Мне нужно отобразить результаты в строке, поэтому я использую этот код.
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
srl.setVisibility(View.GONE);
return false;
}
@Override
public boolean onQueryTextChange(String query) {
currentQuery = query;
if (query.length()>= 3) {
searchFor(currentQuery);
} else {
srl.setVisibility(View.GONE);
}
return false;
}
});
Проблема может быть очевидной. Поскольку я использую firebase, моя функция searchFor()
довольно тяжелая, и мне не нужно, чтобы она выполнялась для каждой буквы. Это не только разрушает пользовательский опыт, но иногда буквально выводит из строя мое приложение, если вы записываете более длинные слова.
Я хочу искать, когда пользователь останавливается. напечатать. Я думаю, что мне нужен обработчик, который задерживает его на секунду, а затем отменяет этот обработчик каждый раз, когда нажимается буквенная клавиша, и устанавливает новый. Теоретически это имеет смысл. Я просто не смог сделать это сам для поискового обзора.
Помощь была бы признательна!
1 ответ:
Самый простой способ достичь этого-это RxJava оператор debounce .
С комбинацией Джейка Уортона RxBinding вы получите что-то вроде этого:
RxSearchView.queryTextChanges(searchView) .debounce(1, TimeUnit.SECONDS) // stream will go down after 1 second inactivity of user .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Consumer<CharSequence>() { @Override public void accept(@NonNull CharSequence charSequence) throws Exception { // perform necessary operation with `charSequence` } });