Преобразуйте мой EditText Input в наблюдаемый поток - PullRequest
0 голосов
/ 30 августа 2018

Итак, я пытался преобразовать свой ввод EditText, полученный из моего TextWatcher, в наблюдаемый поток, но я не могу преобразовать его.

Я пытаюсь следующее

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 ]

0 голосов
/ 30 августа 2018

Вы можете просто создать расширение в 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)
}

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
                        }
                )
0 голосов
/ 30 августа 2018

На самом деле для этого есть библиотека .

Вы можете использовать его как

RxTextView.textChanges(etSearch)
...