0

我正在使用数据绑定并且无法解决多个快速单击问题。我不想在每次点击中都添加一个逻辑,我想创建一个解决方案并期望它在我的整个项目中都能正常工作。

我在这里找到了一种解决方案。该页面的代码片段如下:

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

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

4

1 回答 1

0

欢迎来到 StackOverflow 社区。

只需将您的扩展功能复制到您的绑定适配器。:)

@BindingAdapter("android:myOwnClick")
fun CustomClickHandler(view: View, onSafeClick: (View) -> Unit) {
    val safeClickListener = SafeClickListener {
        onSafeClick(it)
    }
    setOnClickListener(safeClickListener)
}
于 2021-08-04T21:46:51.920 回答