BindingAdapter中的高阶函数

时间:2019-02-13 13:36:28

标签: android kotlin android-databinding higher-order-functions android-binding-adapter

我正在android中使用DataBinding,并且有一个自定义视图: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)}"/>

但是它不能编译。所以我在Stackoverflow中看到了this的答案。但是我的问题是我不能使用Runnable代替kotlin hoc函数,因为我需要通过参数来运行。

我该如何解决?

2 个答案:

答案 0 :(得分:1)

如果可以的话,我遇到了同样的问题(在BindingAdapter中的HOF中传递了一个参数),并提出了一个更优雅的解决方案。您可以确实做到这一点,只需要先将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)
    }
}

答案 1 :(得分:0)

从hoc func切换到此自定义视图的侦听器对我来说很有效:

import com.synnapps.carouselview.ImageClickListener

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