Функция высшего порядка в 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)
}
}