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源代码。

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);

}

}

}

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 的全部内容, 来源链接: utcz.com/qa/410892.html

回到顶部