RxBindingでTextViewの変更を監視する
Android
のTextView
で、インクリメンタルサーチを行う実装をRxBinding
というライブラリを使って行ったので、その方法を簡単にまとめていきたいと思います👷♀️
やっていく
そもそもRxBinding
とは?というところから調べてみると、公式レポに下記のような説明がありました。どうやらAndroidのUIをRx
から使いやすくするためのライブラリのようですね。
RxJava binding APIs for Android UI widgets from the platform and support libraries.
ちなみに、RxSwift
などでは、iOSのUIをバインドするためのrx
というreactive extensionが設けられていますよね。
という訳で早速使っていきましょう🏃🏻♂️
dependencies { // ... implementation 'io.reactivex.rxjava3:rxkotlin:3.0.1' implementation 'io.reactivex.rxjava3:rxandroid:3.0.0' implementation 'com.jakewharton.rxbinding4:rxbinding:4.0.0' }
インストールが完了したので、インクリメンタルサーチの実装を行ってみます。textChanges()
がTextView
のテキスト変更通知をObservable
化するための、RxBinding
のメソッドで、その後に続くskip()
、debounce()
といったオペレーターはRxJava
のものです。ちなみに、今回のようにdistinctUntilChanged()
などで、テキスト変更時にのみ処理を行いたい場合は、事前にmap { it.toString() }
などで、String
に変換することを忘れないようにしましょう。String
に変換せずに使おうとすると、変更毎にCharSequence
の同じインスタンスが流れてくるので、テキストの変更を検知することができなくなります。
binding.accountIdInputTextField .textChanges() .skip(1) .debounce(1, TimeUnit.SECONDS) .map { it.toString() } .distinctUntilChanged() .observeOnMain() .flatMap { presenter.saveAccountFideeIdIfPossible(it) } .subscribe { // TODO: Search. } .addTo(compositeDisposable)
てな感じで本日も以上になります🍺
参考
- https://qiita.com/Reyurnible/items/b2888d2d1d13110d2250
- https://github.com/JakeWharton/RxBinding
- https://stackoverflow.com/questions/41788166/create-an-observable-from-an-edit-text