AutoCompleteTextView with Retrofit 2, RxJava and RxBinding



我是新来的Rx世界,并试图实现我的AutoCompleteTextViewRxJava, RxBindingRetrofit 2

这是我想到的问题:(也许我没有用正确的方法)

我有一个AutoCompleteTextView,在这里我创建了订阅和可观察对象:

subcription = RxTextView.textChangeEvents(clearableEditText)
                .skip(1)
                .debounce(400, TimeUnit.MILLISECONDS)
                .map(new Func1<TextViewTextChangeEvent, String>() {
                    @Override
                    public String call(TextViewTextChangeEvent textViewTextChangeEvent) {
                        return textViewTextChangeEvent.text().toString();
                    }
                })
                .filter(new Func1<String, Boolean>() {
                    @Override
                    public Boolean call(String s) {
                        return s.length() > 2;
                    }
                })
                .flatMap(new Func1<String, Observable<List<String>>>() {
                    @Override
                    public Observable<List<String>> call(String text) {
                        return searchService.getAutoCompleteTermsObservable(text)
                                .subscribeOn(Schedulers.io())
                                .observeOn(AndroidSchedulers.mainThread());
                    }
                })
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<List<String>>() {
                    @Override
                    public void onCompleted() {
                        Log.d("rx", "oncomplete");
                    }
                    @Override
                    public void onError(Throwable e) {
                        Log.e("rx", e.toString());
                    }
                    @Override
                    public void onNext(List<String> strings) {
                        Log.d("rx", strings.size()+"");
                        autoAdapter = new ArrayAdapter<>(MainActivity.this,
                                android.R.layout.simple_dropdown_item_1line, strings);
                        clearableEditText.setAdapter(autoAdapter);
                        clearableEditText.showDropDown();
                    }
                });

我的问题是,当我设置我的EditText与setText()方法,它触发下拉。例如,当我从AutoCompleteTextView的下拉菜单中设置单词时,当我用语音输入设置单词时,它就会这样做。是否有一种方法可以避免触发onTextChanged时,我手动设置?或者我怎样才能解决这个问题?

您确实可以使用unsubscribe(),但取决于您如何设置值,您也可以使用skipWhile。下面是一个例子:

public void handleTextChanges() {
    final String textFromSource = "an";
    Observable.fromArray("a", "an", "ancestor")
            .skipWhile(new Predicate<String>() {
                @Override
                public boolean test(String value) throws Exception {
                    return textFromSource.contains(value);
                }
            })
            .subscribe(new Consumer<String>() {
                @Override
                public void accept(String value) throws Exception {
                    Log.d("Rx", value);
                }
            });
}

这将只使用ancestor(示例是RxJava2,但存在相同的方法)。任何后续的值,即使它们匹配an,也将被使用。你也可以使用filter如果你总是想做这样的检查

最新更新