Функция высшего порядка в BindingAdapter

Я использую DataBinding в Android, и у меня есть собственное представление: CarouselView

Я написал адаптер для этого:

@BindingAdapter("onClick")
fun setOnClick(carouselView: CarouselView, onClick: (position: Int) -> Unit) {
    carouselView.setImageClickListener { position ->
        onClick.run(position)
    }
}

И в XML:

<com.synnapps.carouselview.CarouselView
            android:id="@+id/carouselView"
            ...
            app:onClick="@{(p) -> vm.onAdsClicked(p)}"/>

Но это не компилируется. Так что я видел этот ответ в Stackru. Но моя проблема в том, что я не могу использовать Runnable вместо функции kotlin hoc, потому что мне нужно передать параметр в функцию.

Как я могу решить это?

1 ответ

Решение

Переключение с hoc func на слушателя этого пользовательского представления работало для меня:

import com.synnapps.carouselview.ImageClickListener

@BindingAdapter("onClick")
fun setOnClick(carouselView: CarouselView, imageClickListener: ImageClickListener) {
    carouselView.setImageClickListener(imageClickListener)
}

Если можно, у меня была такая же проблема (передача параметра внутри HOF в BindingAdapter) и придумал более элегантное решение. Вы действительно можете заставить эту работу, вам просто нужно сначала определить HOF как переменную.

ViewModel:

val onAdsClicked = fun(position: Int) {
// Do stuff
}

XML:

<com.synnapps.carouselview.CarouselView
            android:id="@+id/carouselView"
            ...
            app:onClick="@{vm.onAdsClicked}"/>

BindingAdapter:

@BindingAdapter("onClick")
fun setOnClick(carouselView: CarouselView, onClick: (position: Int) -> Unit) {
    carouselView.setImageClickListener { position ->
        onClick(position)
    }
}