简体   繁体   English

BindingAdapter中的高阶函数

[英]Higher order function in BindingAdapter

I am using DataBinding in android and I have a custom view: CarouselView 我在android中使用DataBinding,我有一个自定义视图: CarouselView

I wrote a binding adapter for that: 我写了一个绑定适配器:

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

And in the xml: 并在xml中:

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

But it does not compile. 但它没有编译。 So I saw this answer in the Stackoverflow. 所以我在Stackoverflow中看到了这个答案。 But my problem is that I cannot use Runnable instead of kotlin hoc function because I need to pas a parameter to function. 但我的问题是我不能使用Runnable而不是kotlin hoc函数,因为我需要将参数传递给函数。

How can I solve that? 我怎么解决这个问题?

If I may, I had the same issue (passing a param inside a HOF in a BindingAdapter ) and came up with a more elegant solution. 如果可以的话,我有同样的问题(在BindingAdapter HOF传递给HOF)并提出了更优雅的解决方案。 You can indeed make this work, you just need define the HOF as a variable first. 你确实可以做到这一点,你只需要首先将HOF定义为变量。

ViewModel: 视图模型:

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

XML: XML:

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

BindingAdapter: BindingAdapter:

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

Switching from hoc func to the the listener of this custom view worked for me: 从hoc func切换到此自定义视图的侦听器对我有用:

import com.synnapps.carouselview.ImageClickListener

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM