##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]