Debounce for android button clicks via bindingAdapter

@BindingAdapter("android:onClick")
fun setDebounceListener(view: Button, onClickListener: View.OnClickListener) {
val scope = ViewTreeLifecycleOwner.get(view)!!.lifecycleScope
val clickWithDebounce: (view: View) -> Unit =
debounce(scope = scope) {
onClickListener.onClick(it)
}

view.setOnClickListener(clickWithDebounce)
}


fun <T> debounce(
delayMillis: Long = 300L,
scope: CoroutineScope,
action: (T) -> Unit
): (T) -> Unit {
var debounceJob: Job? = null
return { param: T ->
if (debounceJob == null) {
debounceJob = scope.launch {
action(param)
delay(delayMillis)
debounceJob = null
}
}
}
}

Usage :

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="@{ () -> activity.youOnClickCallbackHere()}"
android:text="Click with debounce" />
Balwinder Singh Rajput

Hi there ๐Ÿ‘‹ Namaste ๐Ÿ™๐Ÿป .๐Ÿ‘จโ€๐Ÿ’ป developing apps from 12+ years. ๐Ÿ‘จโ€๐Ÿซ IoT | E-commerce | baking domain expert.