android - BindingAdapter 中的高阶函数

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

我在 android 中使用 DataBinding 并且我有一个自定义 View :CarouselView

我为此编写了一个绑定(bind)适配器:

@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)}"/>

但它不编译。所以我看到了this在 Stackoverflow 中回答。但我的问题是我不能使用 Runnable 而不是 kotlin hoc 函数,因为我需要传递一个参数来运行。

我该如何解决?

最佳答案

如果可以的话,我遇到了同样的问题(在 BindingAdapter 的 HOF 中传递参数)并想出了一个更优雅的解决方案。您可以确实做到这一点,您只需要先将 HOF 定义为变量。

View 模型:

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

XML:

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

绑定(bind)适配器:

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

关于android - BindingAdapter 中的高阶函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54671534/

相关文章:

android - Kotin lateinit Var 未初始化 - Android Studio

未调用 Android MotionLayout 转换监听器

android - 如何使用 ObservableField

Android + 数据绑定(bind)@style

android - 我正在使用 Linkify.WEB_URLS 在 TextView 中链接 URL,但看起来正则表达式存在错误

android - 从 CSV 文件大量插入 SQLite 数据库

java - 在 Java-Android 中设置链接可点击

android - 哪种 Activity 生命周期方法最适合注册/取消注册到事件总线?

android - 在Splashscreen Activity里面我实现了接口(interface)。 Kotlin中如何将接口(interface)数据发送到多个Activity?

android - 数据绑定(bind)中的 msg :Cannot find the getter for attribute 'android:text' with value type java. lang.String?