【问题标题】:AutoCompleteTextView with Retrofit 2, RxJava and RxBinding带有 Retrofit 2、RxJava 和 RxBinding 的 AutoCompleteTextView
【发布时间】:2016-11-13 18:37:53
【问题描述】:

我是Rx 世界的新手,并尝试使用RxJavaRxBindingRetrofit 2 来实现我的AutoCompleteTextView

这是我想出的麻烦:(也许我没有以正确的方式做。)

我有一个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();
                    }
                });

我的问题是当我使用 setText() 方法设置我的 EditText 时,它会触发下拉菜单。例如,当我从AutoCompleteTextView 的下拉列表中设置单词以及使用语音输入设置单词时,它会这样做。手动设置时有没有办法避免触发onTextChanged?或者我该如何解决?

【问题讨论】:

  • 问题是,当你设置文本时,observable 会发出事件,在设置文本之前尝试取消订阅,然后再订阅。
  • 是的,就这么简单!谢谢@Agustin Sivoplás。
  • 很高兴为您提供帮助!万事如意!

标签: android retrofit2 rx-android rx-binding rx-java2


【解决方案1】:

您确实可以使用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

【讨论】:

  • 感谢@Jordy Langen 的替代方法。但是,这不是发出不必要的网络请求吗?
  • 只要skipWhile中的第一个真值已经匹配
  • 当我从 AutoComplete 下拉列表中选择项目时,它会使用该值调用 setText,并且因为它触发 onTextChange,它只会发出一个请求来获取自动完成建议,并且使用 skipWhile,下拉菜单将不会显示.与语音输入相同,我将调用 setText,这一次它可能匹配也可能不匹配,但在这些情况下也不会显示下拉菜单。是的,实际上,这种方法似乎比我的 setTextSafely() 方法更干净。我在几个地方调用了这个方法,所以如果我想让自动完成成为用户偏好,你的方式会给我灵活性。谢谢,@Jordy Langen
  • 再想一想,我也可以在我的 setTextSafely() 方法中检查该偏好。 =)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-17
相关资源
最近更新 更多