私は使っている
RxSearchView.queryTextChangeEvents
「Search As You Type」のイベントを検出し、検索を送信すると、SAYT は提案を取得し、送信すると完全な検索を実行します。
現時点で2つの問題があります。
入力中に提案を取得しているときに、突然 [送信] をクリックすると完全な検索が実行されますが、問題は、進行中の提案要求がある場合、完全に表示されるべきではないときに画面に表示される場合があることです。検索が優先されます。
そのため、フル検索で送信がある場合に備えて、提案からのリクエストをキャンセル (登録解除) したいと思います。
このコードでこれを達成するにはどうすればよいですか?
別の問題は、検索ビューで検索用語を削除して空になると、アダプターがクリアされますが、検索テキストをクリアすると、進行中の提案要求がまだあり、結果が設定される場合がありますが、ユーザーが検索ビューをクリアすると、すべてのリクエストがキャンセルされることを保証したいと思います。
これが私が使用しているコードです。
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
clearAdapter();
}
return !empty;
}
})
.concatMap(new Func1<SearchViewQueryTextEvent, Observable<Object>>() {
@Override
public Observable<Object> call(SearchViewQueryTextEvent searchViewQueryTextEvent) {
String searchTerm = searchViewQueryTextEvent.queryText().toString();
boolean submitted = searchViewQueryTextEvent.isSubmitted();
//Hide RecyclerView
//Show loading indicator
showLoading();
Observable<Object> observable;
if (submitted) {
observable = getFullSearch(searchTerm);
} else {
observable = getSuggestionsSearch(searchTerm);
}
return observable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnCompleted(new Action0() {
@Override
public void call() {
//Show RecyclerView
//Hide loading indicator
showContent();
}
});
}
})
.subscribe(new Subscriber<Object>() {
@Override
public void onNext(Object object) {
//Set data on recyclerview and notify change.
setData(object);
}
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
});
}