BindingAdapter 中的高阶函数
Higher order function in BindingAdapter
我在 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)}"/>
但是编译不通过。所以我在 Whosebug 中看到了 答案。但我的问题是我不能使用 Runnable 而不是 kotlin hoc 函数,因为我需要传递一个参数来运行。
我该如何解决?
从 hoc func 切换到此自定义视图的侦听器对我有用:
import com.synnapps.carouselview.ImageClickListener
@BindingAdapter("onClick")
fun setOnClick(carouselView: CarouselView, imageClickListener: ImageClickListener) {
carouselView.setImageClickListener(imageClickListener)
}
如果可以的话,我遇到了同样的问题(在 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("onClick")
fun setOnClick(carouselView: CarouselView, onClick: (position: Int) -> Unit) {
carouselView.setImageClickListener { position ->
onClick(position)
}
}
我在 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)}"/>
但是编译不通过。所以我在 Whosebug 中看到了
我该如何解决?
从 hoc func 切换到此自定义视图的侦听器对我有用:
import com.synnapps.carouselview.ImageClickListener
@BindingAdapter("onClick")
fun setOnClick(carouselView: CarouselView, imageClickListener: ImageClickListener) {
carouselView.setImageClickListener(imageClickListener)
}
如果可以的话,我遇到了同样的问题(在 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("onClick")
fun setOnClick(carouselView: CarouselView, onClick: (position: Int) -> Unit) {
carouselView.setImageClickListener { position ->
onClick(position)
}
}