【问题标题】:RxSearchView observing textChanges and Events at the same timeRxSearchView 同时观察 textChanges 和 Events
【发布时间】:2016-12-02 13:47:05
【问题描述】:

我正在使用RxSearchView以“输入时搜索”的形式查询文本更改

RxSearchView.queryTextChanges(searchView)

但我也想捕捉用户何时提交搜索,所以我必须使用

RxSearchView.queryTextChangeEvents(searchView)searchView.setOnQueryTextListener

当我使用最后两个中的任何一个时,看起来他们正在取消第一个 RxSearchView.queryTextChanges,看起来只能有 1 个可观察对象附加到 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) {
            }


        });
    }

【问题讨论】:

    标签: android rx-java searchview rx-binding


    【解决方案1】:

    只有一个 observable 因为它覆盖了视图的监听器,但是你可以使用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();
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多