java - 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做到这一点?
解决方案
当我
setText(output)
进入循环时。要设置文本,我首先需要删除侦听器,然后再次设置侦听器。如何使用RxJava做到这一点?
为了满足要求,我设法扩展了RxBinding源代码,如下所示。
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)
}));
推荐阅读
- javascript - 试图将 filereader.readAsDataURL 放入对象数组中,以便我可以显示拖放事件中的图像
- ruby-on-rails - 排序选择结果
- javascript - Reactjs 将变量传递给另一个类的函数
- python - 在 Python 中的 For 循环每次迭代后创建一个新列
- sql - 使用 SQL Server 查询给定表的所需表输出
- javascript - 如何在函数中实现 Observable
- oracle - 转到过程/函数/包中的特定行
- scala - pyspark 在尝试并行发出 URL 请求时挂起
- sql - 时间戳记到可读的东西
- c - cudaMalloc 在哪个内存空间分配内存?