RxSearchView 同时观察 textChanges 和 Events
RxSearchView observing textChanges and Events at the same time
我正在使用 RxSearchView
以 "Search as you type"
的形式查询文本更改
RxSearchView.queryTextChanges(searchView)
但是我也想在用户提交搜索时捕捉到,所以我必须使用
RxSearchView.queryTextChangeEvents(searchView)
或 searchView.setOnQueryTextListener
当我使用最后两个中的任何一个时,看起来它们正在取消第一个 RxSearchView.queryTextChanges
,看起来只能有一个 observable 附加到 SearchView。
如何同时观察两个事件?
这是完整的代码
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) {
}
});
}
只有一个可观察对象,因为它会覆盖视图的侦听器,但您可以使用 RxSearchView.queryTextChangeEvents(searchView)
来监视这两种类型的事件。它给出了 SearchViewQueryTextEvent
事件流。对于每个事件,您可以检查 isSubmitted()
以确定它是提交还是更改事件,并使用 queryText()
.
获取当前文本
下面是如何使用 ConnectableObservable
将事件放入两个流中以分别过滤 --
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();
我正在使用 RxSearchView
以 "Search as you type"
RxSearchView.queryTextChanges(searchView)
但是我也想在用户提交搜索时捕捉到,所以我必须使用
RxSearchView.queryTextChangeEvents(searchView)
或 searchView.setOnQueryTextListener
当我使用最后两个中的任何一个时,看起来它们正在取消第一个 RxSearchView.queryTextChanges
,看起来只能有一个 observable 附加到 SearchView。
如何同时观察两个事件?
这是完整的代码
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) {
}
});
}
只有一个可观察对象,因为它会覆盖视图的侦听器,但您可以使用 RxSearchView.queryTextChangeEvents(searchView)
来监视这两种类型的事件。它给出了 SearchViewQueryTextEvent
事件流。对于每个事件,您可以检查 isSubmitted()
以确定它是提交还是更改事件,并使用 queryText()
.
下面是如何使用 ConnectableObservable
将事件放入两个流中以分别过滤 --
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();