RxTextView.textChanges with setText on Edittext(RxTextView.textChanges 与 Edittext 上的 setText)
问题描述
RxTextView.textChanges(editText)
.map(CharSequence::toString)
.debounce(200, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(input -> {
output = //...do something with input
editText.setText(ouput)
}));
当我 setText(output)
它进入循环.要设置文本,我首先需要删除侦听器,然后再次设置侦听器.如何使用 RxJava 做到这一点?
When I setText(output)
it goes in loop. To set the text I first need to remove listener and then set listener again. How can I do this using RxJava?
推荐答案
当我
setText(output)
它进入循环.要设置文本,我首先需要删除侦听器,然后再次设置侦听器.如何使用 RxJava 做到这一点?
When I
setText(output)
it goes in loop. To set the text I first need to remove listener and then set listener again. How can I do this using RxJava?
为了满足要求,我设法扩展了 RxBinding 源代码,如下所示.
To meet the requirement I managed to extend the RxBinding source code as follows.
EditableTextViewTextObservable.java
:
public class EditableTextViewTextObservable extends InitialValueObservable<CharSequence> {
private final TextView view;
EditableTextViewTextObservable(TextView view) {
this.view = view;
}
@Override
protected void subscribeListener(Observer<? super CharSequence> observer) {
EditableTextViewTextObservable.Listener listener = new EditableTextViewTextObservable.Listener(view, observer);
observer.onSubscribe(listener);
view.addTextChangedListener(listener);
}
@Override protected CharSequence getInitialValue() {
return view.getText();
}
final static class Listener extends MainThreadDisposable implements TextWatcher {
private final TextView view;
private final Observer<? super CharSequence> observer;
Listener(TextView view, Observer<? super CharSequence> observer) {
this.view = view;
this.observer = observer;
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if (!isDisposed()) {
view.removeTextChangedListener(this);
observer.onNext(s);
view.addTextChangedListener(this);
}
}
@Override
protected void onDispose() {
view.removeTextChangedListener(this);
}
}
}
EditableRxTextView.java
:
public final class EditableRxTextView {
@CheckResult
@NonNull
public static InitialValueObservable<CharSequence> textChanges(@NonNull TextView view) {
return new EditableTextViewTextObservable(view);
}
}
用法:
EditableRxTextView.textChanges(editText)
.map(CharSequence::toString)
.debounce(200, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(input -> {
output = //...do something with input
editText.setText(ouput)
}));
这篇关于RxTextView.textChanges 与 Edittext 上的 setText的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:RxTextView.textChanges 与 Edittext 上的 setText


- 如何使用WebFilter实现授权头检查 2022-01-01
- value & 是什么意思?0xff 在 Java 中做什么? 2022-01-01
- Safepoint+stats 日志,输出 JDK12 中没有 vmop 操作 2022-01-01
- 将log4j 1.2配置转换为log4j 2配置 2022-01-01
- Eclipse 插件更新错误日志在哪里? 2022-01-01
- Jersey REST 客户端:发布多部分数据 2022-01-01
- C++ 和 Java 进程之间的共享内存 2022-01-01
- Java包名称中单词分隔符的约定是什么? 2022-01-01
- 从 finally 块返回时 Java 的奇怪行为 2022-01-01
- Spring Boot连接到使用仲裁器运行的MongoDB副本集 2022-01-01