1

我有一个对象数组,我想根据EditTextandroid 视图上的文本用户类型过滤该数组。

我认为我应该尝试将 POJO 数组转换为字符串的 Observable,这就是我所做的:

    Observable<String> professionsObservable = Observable.fromArray(((GetStartedActivity) getActivity()).professions)
            .map(profession -> {
                if (profession.getName().length() > 0) {
                    professionsNameList.add(capitalizeFirstLetter(profession.getName()));
                }

                return professionsNameList;
            })
            .flatMapIterable(items -> items);

现在我想将 中的文本EditText与我在上面发布的 `professionsObservable 结合起来。

这是我正在使用的代码:

    RxTextView.textChangeEvents(etProfession)
            .doOnEach(notif -> {
                if (etProfession.getText().toString().trim().length() > 0) {
                    etCompany.setVisibility(GONE);
                    etIndustry.setVisibility(GONE);
                } else {
                    etCompany.setVisibility(VISIBLE);
                    etIndustry.setVisibility(VISIBLE);
                }
            })
            .debounce(EDITTEXT_DELAY, TimeUnit.MILLISECONDS)
            .skip(1)
            .map(textChangeEvent -> textChangeEvent.text().toString())
            .switchMap(search -> {
                return professionsObservable
                        .filter(profession -> {
                            return profession.toLowerCase().startsWith(search);
                        });
                    }
            )
            .toList()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(
                    filteredProfessions -> {
                        Timber.i("NOT ENTERING");
                        rvProfession.setVisibility(VISIBLE);
                        professionAdapter.addItems(filteredProfessions);
                    },
                    throwable -> Log.i("THROW", "PROFESSIONS ", throwable));

我正在使用map运算符将​​文本更改事件转换为字符串,然后对于我从正在使用的流中获得的每个字符串switchMap(因为我不关心以前搜索的结果)。然后我将所有字符串组合到一个列表中toListsubscribe问题是,当我使用的初始数组中有很多字符串并且我确实键入了符合操作员条件的文本时,它永远不会到达调用filter

这是我可能在这里错过的东西吗?

编辑:我将代码更新为:

        RxTextView.textChangeEvents(etProfession)
            .doOnEach(notif -> {
                if (etProfession.getText().toString().trim().length() > 0) {
                    etCompany.setVisibility(GONE);
                    etIndustry.setVisibility(GONE);
                } else {
                    etCompany.setVisibility(VISIBLE);
                    etIndustry.setVisibility(VISIBLE);
                }
            })
            .subscribeOn(AndroidSchedulers.mainThread())
            .debounce(EDITTEXT_DELAY, TimeUnit.MILLISECONDS)
            .skip(1)
            .map(textChangeEvent -> textChangeEvent.text().toString())
            .flatMap(search -> {
                return Observable.fromArray(((GetStartedActivity) getActivity()).professions)
                        .map(profession -> {
                            List<String> professionsList = new ArrayList<>();
                            if (profession.getName().length() > 0) {
                                professionsList.add(capitalizeFirstLetter(profession.getName()));
                            }
                            return professionsList;
                        })
                        .flatMapIterable(items -> items)
                        .filter(profession -> {
                            if (profession.toLowerCase().startsWith(search.toLowerCase())) {
                            }

                            return profession.toLowerCase().startsWith(search.toLowerCase());
                        });
            })
            .toList()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(
                    filteredProfessions -> {
                        rvProfession.setVisibility(VISIBLE);
             //        professionAdapter.addItems(filteredProfessions);
                    },
                    throwable -> Log.i("THROW", "PROFESSIONS ", throwable));

如果我删除toList() 运营商,我的代码可以工作(进入subscribe通话),但如果我把它留在那里,它就不会了。任何人都知道为什么?

4

1 回答 1

0

根据我的经验,RxBinding.textChangeEvents()或任何其他事件之后需要.subscribeOn(AndroidSchedulers.mainThread()) 。因此,您可能会通过添加.subscribeOn(Schedulers.io)导致它失败

请参阅https://github.com/JakeWharton/RxBinding/blob/master/rxbinding/src/main/java/com/jakewharton/rxbinding2/internal/Preconditions.java中的方法.checkMainThread()

更新

另外,可能是因为.onComplete()永远不会来自上游,所以 .toList()永远不会执行。

于 2018-01-18T16:00:02.497 回答