KotlinのActivityで定義したメソッドをAdapterから呼び出すには?Interfaceを活用した最適な実装方法を、コード例と共に解説!

はじめに

今回は、Androidアプリ開発(Kotlin)における、Activityで定義したメソッドをAdapterから呼び出す方法に関して書いていこうと思います。具体的な実装としては、ListAdaptersetOnClickListenerメソッドが走るタイミングで、Activityで定義したメソッド(Fragmentを表示する)を呼び出すというものになります。

少々前置きが長いため、実装方法について見たい方はこちらをタップ!

背景

Activityで定義したメソッドをAdapterで呼び出したい時、interfaceを使う以外のアプローチとして、

  1. Coroutineを使って行う方法
  2. LiveDataを使って行う方法
  3. グローバル変数をメソッド呼び出しのキッカケとする方法

などがあると考えましたが、以下の理由から、今回はinterfaceを使用して実装しました。

Coroutineを使ってメソッドを呼び出すアプローチを取らなかった理由

CoroutineのGlobalScopeはActivityのライフサイクルに依存せず動くため、親となるActivityCoroutineのGlobalScopeを付与し、Adapter下のCoroutineに親のScopeを持たせ、メソッドを走らすタイミングをGlobalScopeで管理しようと考えました。

しかし、Adapterabstract classに変更し親のScopeを継承すると、ActivityでUI(Fragment)を表示するメソッドが呼び出せなくなってしまうため、この方法を取りませんでした。

LiveDataを使って行う方法を取らなかった理由

次に、LiveDataを使って値の購読処理を行い、値の変更を検知した際にActivityで定義したメソッドを呼び出す方法を検討しました。具体的な流れは、Activityで値の購読処理を記述し、Adapterでボタンが押されたタイミングで購読している値を変更する。値が変更されたら、Activityで定義したメソッドを呼び出すというものです。

通常、LiveDataオブジェクトは ViewModelオブジェクトに格納するのが一般的ですが、今回は

そのため、購読処理をメソッド呼び出しのためだけに利用するのは適切ではないと判断し、このアプローチを取りませんでした。