代码之家  ›  专栏  ›  技术社区  ›  Rajat Beck

将EditText输入转换为可观察的流

  •  0
  • Rajat Beck  · 技术社区  · 6 年前

    所以我一直在尝试将我从TextWatcher获得的EditText输入转换成一个可观察的流,但我无法转换它。

    我正在尝试以下方法

    etSearch.addTextChangedListener(object: TextWatcher{
            override fun afterTextChanged(p0: Editable?) {
                //I want to create an observable here to send events
                   Observable.create(e->e.next(p0));
            }
    
            override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
    
            }
    
            override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
    
            }
        })
    

    我不知道我应该在哪里创建我的事件,以便我能够订阅它。

    2 回复  |  直到 6 年前
        1
  •  3
  •   Prithvi Bhola    6 年前

    您只需在中创建一个扩展 kotlin 返回一个 Flowable EditTextFlow

    fun EditText.addTextWatcher(): Flowable<EditTextFlow> {
        return Flowable.create<EditTextFlow>({ emitter ->
            addTextChangedListener(object : TextWatcher {
                override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
                    emitter.onNext(EditTextFlow(p0.toString(), EditTextFlow.Type.BEFORE))
                }
    
                override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
                    emitter.onNext(EditTextFlow(p0.toString(), EditTextFlow.Type.ON))
                }
    
                override fun afterTextChanged(p0: Editable?) {
                    emitter.onNext(EditTextFlow(p0.toString(), EditTextFlow.Type.AFTER))
                }
            })
        }, BackpressureStrategy.BUFFER)
    }
    

    编辑文本流

    data class EditTextFlow(
            val query: String,
            val type: Type
    ) {
        enum class Type { BEFORE, AFTER, ON }
    }
    

    etSearch.addTextWatcher()
                    .filter { it.type == EditTextFlow.Type.AFTER }
                    .map { it.query }
                    .flatMap { /*Make any request or anything*/ }
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribeBy(
                            onNext = {
                                // Update UI here
                            },
                            onError = {
                                // Log error
                            }
                    )
    
        2
  •  0
  •   jujka    6 年前

    实际上,有一个 library

    RxTextView.textChanges(etSearch)