Я новичок в Rx
мире и попытаться реализовать мой AutoCompleteTextView
с RxJava
, RxBinding
и Retrofit 2
.AutoCompleteTextView с Модернизированный 2 RxJava и RxBinding
Вот что я придумал что хлопотно: (. Может быть, я не делаю это в правильном направлении)
У меня есть 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
, когда я устанавливаю его вручную? Или как я могу это исправить?
Проблема заключается в том, что при установке текста наблюдаемый испускает событие, пытается отказаться от подписки перед тем, как задать текст и подписаться снова после этого. – AndroidRuntimeException
Да, просто! Спасибо @Agustin Sivoplás. –
Рад помочь! Всего наилучшего! – AndroidRuntimeException