如何使用自定义的onClick进行数据绑定

How to use customized onClick for data binding

我正在使用数据绑定,但无法解决多次快速点击问题。相反,我不想在每次点击时都添加逻辑,我想创建一次解决方案并希望它在我的项目中发挥作用。

我找到了一个解决方案 here。该页面的代码片段如下:

class SafeClickListener(
        private var defaultInterval: Int = 1000,
        private val onSafeCLick: (View) -> Unit
) : View.OnClickListener {
    private var lastTimeClicked: Long = 0
    override fun onClick(v: View) {
        if (SystemClock.elapsedRealtime() - lastTimeClicked < defaultInterval) {
            return
        }
        lastTimeClicked = SystemClock.elapsedRealtime()
        onSafeCLick(v)
    }
}

并使用扩展功能:

fun View.setSafeOnClickListener(onSafeClick: (View) -> Unit) {
    val safeClickListener = SafeClickListener {
        onSafeClick(it)
    }
    setOnClickListener(safeClickListener)
}

最后,对于任何视图,我们都可以简单地调用:

anyView.setSafeOnClickListener {
    doYourStuff()
}

太棒了。但它仅在我调用 setOnClickListener 到视图但我正在使用数据绑定时适用。我在哪里使用这样的东西:

android: onClick="@{(view) -> myViewModel.UIEvents(SomeUIEvent.showDialog)}"

我知道如果我能创建一个绑定适配器,我就能解决问题。但是,我做不出一个有用的。 我应该在这里放什么代码:

@BindingAdapter("android:myOwnClick")
fun CustomClickHandler(view: View, "some code here") {
    "And some codes here to deligate onclick to"
    "The setSafeOnClickListener defined above"
}

这样我就可以在我的xml(数据绑定)中使用:

android: myOwnClick="@{(view) -> myViewModel.UIEvents(SomeUIEvent.showDialog)}"

我怎样才能做到这一点?请帮忙。谢谢

欢迎来到 Whosebug 社区。

只需将扩展函数复制到绑定适配器即可。 :)

@BindingAdapter("android:myOwnClick")
fun CustomClickHandler(view: View, onSafeClick: (View) -> Unit) {
    val safeClickListener = SafeClickListener {
        onSafeClick(it)
    }
    setOnClickListener(safeClickListener)
}