iOSエンジニアのつぶやき

毎朝8:30に iOS 関連の技術について1つぶやいています。まれに釣りについてつぶやく可能性があります。

RxBindingでTextViewの変更を監視する

AndroidTextViewで、インクリメンタルサーチを行う実装をRxBindingというライブラリを使って行ったので、その方法を簡単にまとめていきたいと思います👷‍♀️

github.com

やっていく

そもそも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)

てな感じで本日も以上になります🍺

参考

その他の記事

yamato8010.hatenablog.com

yamato8010.hatenablog.com

yamato8010.hatenablog.com