May 24, 2021
--
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" />