In our app we have MVP and Dagger 2. We have also a lot of RecyclerView’s adapters which need Listener’s for click actions. We try to avoid using Listeners which activities or fragments have to implement it. Right now we can inject presenter’s function directly to adapter. Inject must look something like this:
@Module
object MyModule {
@Provides
@JvmStatic
@JvmSuppressWildcards
@jsingle
fun provideClickFunction(presenter: MyContract.Presenter): Function1<@JvmWildcard MyModel, Unit> =
presenter::onModelClick
@Provides
@JvmStatic
@jsingle
fun providePresenter(presenter: MyPresenter): MyContract.Presenter = presenter
@Provides
@JvmStatic
@jsingle
fun provideAdapter(adapter: MyAdapter): ListAdapter<*, *> = adapter
}
class MyAdapter @Inject constructor(private val clickFunction: (MyModel) -> Unit)
: ListAdapter ... {
inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) {
fun bind(model: MyModel) =
itemView.setOnClickListener {
clickFunction(model)
}
}
}