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
				
        
 
            
        基础教程推荐
- Java Swing计时器未清除 2022-01-01
 - 从 python 访问 JVM 2022-01-01
 - 不推荐使用 Api 注释的描述 2022-01-01
 - 如何在 Spring @Value 注解中正确指定默认值? 2022-01-01
 - 如何在 JFrame 中覆盖 windowsClosing 事件 2022-01-01
 - 大摇大摆的枚举 2022-01-01
 - Java 实例变量在两个语句中声明和初始化 2022-01-01
 - 在 Java 中创建日期的正确方法是什么? 2022-01-01
 - 验证是否调用了所有 getter 方法 2022-01-01
 - 多个组件的复杂布局 2022-01-01
 
    	
    	
    	
    	
    	
    	
    	
    	
						
						
						
						
						
				
				
				
				