【问题标题】:Convert my EditText Input to an observable stream将我的 EditText 输入转换为可观察的流
【发布时间】:2018-08-30 11:32:16
【问题描述】:

所以我一直在尝试将从 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) {

        }
    })

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

【问题讨论】:

    标签: android kotlin rx-kotlin


    【解决方案1】:

    您可以简单地在kotlin 中创建一个扩展,它返回FlowableEditTextFlow

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

    EditTextFlow

    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】:

      其实这个有library

      你可以把它当作

      RxTextView.textChanges(etSearch)
      

      【讨论】:

      • 我不想使用 Rxbinding 库
      猜你喜欢
      • 2018-07-27
      • 2018-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-23
      相关资源
      最近更新 更多