RxJava实现联想搜索(模糊搜索+定向搜索)

1. 需求场景

这里写图片描述

2. API说明

(1) debonuce

这里写图片描述

仅在过了一段指定的时间还没发射数据时才发射一个数据,会过滤掉发射速率过快的数据项

(2) Skip

这里写图片描述
Observable’发射的前N项数据,只保留之后的数据。

(3) switchMap

这里写图片描述
最新发射的最终显示

(4)filter

这里写图片描述
只有通过测试的数据才会被发射

(5)map:

这里写图片描述
将一个发射数据的Observable变换为多个Observables,然后将它们发射的数据合并后放进一个单独的Observable

3. 具体实现

依赖:

    compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
    compile 'io.reactivex.rxjava2:rxjava:2.1.8'
    compile 'com.jakewharton.rxbinding2:rxbinding:2.0.0'

(1)xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:gravity="center_horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <EditText
        android:layout_marginTop="20dp"
        android:id="@+id/ed"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:hint="输入搜索字段"
        />

    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
</LinearLayout>

(2)核心代码实现

RxTextView.textChanges(et) //绑定EditText
                .skip(1)//去掉第一次选中
                .debounce(300, TimeUnit.MILLISECONDS);
                .switchMap(new Function<CharSequence, ObservableSource<List<T>>>() {
                    @Override
                    public ObservableSource<List<T>> apply(final CharSequence charSequence) throws Exception {
                        return searchService.getSearchResults(charSequence.toString());
                    }
                })
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeWith(observer);
//searchService.getSearchResults是一个网络请求

(3)效果图:

这里写图片描述

4. 提升优化:同时支持定向搜索和模糊搜索

flatMap实现不同输入串,发送不同请求,将所有请求的返回结果,封装到一个Bean中,根据不同的code,显示不同效果

主要代码:
 RxTextView.textChanges(et) //绑定EditText
                .skip(1)//去掉第一次选中
                .debounce(300, TimeUnit.MILLISECONDS);//300毫秒防反跳
                 .flatMap(new Function<CharSequence, ObservableSource<SearchResultPackage>>() {
                    @Override
                    public ObservableSource<SearchResultPackage> apply(CharSequence charSequence) throws Exception {
                        //字符为空
                        if (TextUtils.isEmpty(charSequence)) {
                            return Observable.create(new ObservableOnSubscribe<SearchResultPackage>() {
                                @Override
                                public void subscribe(ObservableEmitter<SearchResultPackage> emitter) throws Exception {
                                    if (!emitter.isDisposed()) {
                                        SearchResultPackage resultPackage = new SearchResultPackage();
                                        resultPackage.code = 0;
                                        emitter.onNext(resultPackage);
                                        emitter.onComplete();
                                    }

                                }
                            });
                        }
                        //定向输入
                        if (charSequence.length() == 6) {
                            return searchService.getDetailResults(charSequence.toString());
                        }

                        //普通搜索
                        return searchService.getSearchResults(charSequence.toString());
                    }
                })
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeWith(observer);

效果图:
这里写图片描述

5. Demo地址

[RxAndroid/app/src/main/java/com/bpj/rxandroid/rxbinding/RxBindingActivity.java]

猜你喜欢

转载自blog.csdn.net/baopengjian/article/details/79741976