0

RxSearchView「入力しながら検索」の形式でテキストの変更を照会するために使用しています

RxSearchView.queryTextChanges(searchView)

しかし、ユーザーが検索を送信したときにもキャッチしたいので、使用する必要があります

RxSearchView.queryTextChangeEvents(searchView)またsearchView.setOnQueryTextListener

これらの最後の2つのいずれかを使用すると、最初のをキャンセルしているようにRxSearchView.queryTextChanges見えます.SearchViewに接続できるオブザーバブルは1つだけのようです.

両方のイベントを同時に観察するにはどうすればよいですか?

ここに完全なコードがあります

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) {
            }


        });
    }
4

1 に答える 1

1

ビューのリスナーを上書きするため、監視可能なものは 1 つだけですが、RxSearchView.queryTextChangeEvents(searchView)両方のタイプのイベントを監視するために使用できます。イベントの流れを提供しSearchViewQueryTextEventます。イベントごとに、isSubmitted()それが送信イベントなのか変更イベントなのかを確認し、現在のテキストを で取得できますqueryText()

ConnectableObservableイベントを 2 つのストリームに取得して別々にフィルタリングする方法を次に示します。

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();
于 2016-12-02T14:37:12.647 に答える