java 实现文件模糊检索_RxJava实现联想搜索(模糊搜索+定向搜索)
1. 需求场景 2. API说明(1) debonuce 仅在过了一段指定的时间还没发射数据时才发射一个数据,会过滤掉发射速率过快的数据项(2) Skip Observable’发射的前N项数据,只保留之后的数据。(3) switchMap 最新发射的最终显示(4)filter 只有通过测试的数据才会被发射(5)map: 将一个发射数据的Observable变换为多个Observables,然后将
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
(2)核心代码实现
RxTextView.textChanges(et) //绑定EditText
.skip(1)//去掉第一次选中
.debounce(300, TimeUnit.MILLISECONDS);
.switchMap(new Function>>() {
@Override
public ObservableSource> 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>() {
@Override
public ObservableSource apply(CharSequence charSequence) throws Exception {
//字符为空
if (TextUtils.isEmpty(charSequence)) {
return Observable.create(new ObservableOnSubscribe() {
@Override
public void subscribe(ObservableEmitter 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地址
更多推荐
所有评论(0)