【问题标题】:How to create an Rx Search view that will filter a recycler view with a query如何创建将使用查询过滤回收者视图的 Rx 搜索视图
【发布时间】:2016-07-15 05:05:16
【问题描述】:

我想实现一个 Rx Search 视图,该视图将使用字符串过滤回收器视图,并检查本地 Realm 数据库并提出改造请求,然后将所有结果组合起来而不重复??所以,换句话说:我想在搜索视图中的文本更改事件,使用输入字符串发出网络请求、数据库查询并与不重复的结果组合

这是我的初始代码:

RxSearchView.queryTextChanges(searchView)
            .filter(charSequence -> !TextUtils.isEmpty(charSequence))
            .throttleLast(100, TimeUnit.MILLISECONDS)
            .debounce(200, TimeUnit.MILLISECONDS)
            .onBackpressureLatest()
            .flatMap(charSequence -> userListPresenter.search(charSequence))
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.io())
            .onErrorResumeNext(Observable.empty())
            .subscribe((Action1) response -> userListPresenter.showSearchResult((List<UserModel>) response));

userListPresenter.search(charSequence)) 应该返回一个没有重复的串联响应的 observable,谢谢 :)

userListPresenter.search(charSequence)):

Observable.create(subscriber -> {
        if (Utils.isNetworkAvailable(getContext())) {
            if (!subscriber.isUnsubscribed()) {
                subscriber.onNext(restApi.search(query));
                subscriber.onCompleted();
            }
        }).mergeWith(
                    Observable.create(subscriber -> {
        if (!subscriber.isUnsubscribed()) {
            subscriber.onNext(realmManager.getWhere(query));
            subscriber.onCompleted();
        }
    })).collect(HashSet::new, HashSet::add)
            .flatMap(Observable::from);

【问题讨论】:

    标签: android rx-java


    【解决方案1】:

    如果我正确理解了您的问题。有一个很好的方法可以组合多个 Observable 的发射,请看zip method。 因此,您的搜索方法将如下所示:

    public Observable<List<MyItem>> search(CharSequence query) {
        return Observable.zip(
                    observeNetwork(query),
                    observeRealm(query),
                    new Func2<List<MyItem>, List<MyItem>, List<MyItem>>() {
                        @Override
                        public List<MyItem> call(List<MyItem> networkResult, List<MyItem> databaseResult) {
                            return merge(networkResult,databaseResult);
                        }
                    }
                );
    }
    
    private Observable<List<MyItem>> observeRealm(CharSequence searchString) {
        return Observable.create( /* do your realm stuff */);
    }
    
    private Observable<List<MyItem>> observeNetwork(CharSequence searchString) {
        return return Observable.create( /* do your network stuff */);
    }
    
    private List<MyItem> merge(List<MyItem> networkResult, List<MyItem> databaseResult) {
        List<MyItem> result = new ArrayList<>();
        result.addAll(databaseResult);
        for(MyItem newItem : networkResult){
            if(!databaseResult.contains(newItem)){
                result.add(newItem);
            }
        }
        return result;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-18
      • 1970-01-01
      • 1970-01-01
      • 2022-07-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多