Skip to content

Instantly share code, notes, and snippets.

@macsystems
Created January 28, 2020 15:33
Show Gist options
  • Select an option

  • Save macsystems/37d74706347be4ef4400a417bb62f043 to your computer and use it in GitHub Desktop.

Select an option

Save macsystems/37d74706347be4ef4400a417bb62f043 to your computer and use it in GitHub Desktop.
Debounce Click Listener Extension which prevents user invoking some function to often
private const val defaultDebounce: Long = 500
/**
* Prevents that the click events gets called too often by fast clicking user
*/
@UiThread
fun View.setDebounceOnClickListener(@IntRange(from = 0, to = Integer.MAX_VALUE.toLong()) debounceTime: Long = defaultDebounce, listener: (View) -> Unit) {
this.setOnClickListener(object : View.OnClickListener {
private var lastClickTime: Long = 0
override fun onClick(v: View) {
if (SystemClock.elapsedRealtime() - lastClickTime < debounceTime) return
else listener(v)
lastClickTime = SystemClock.elapsedRealtime()
}
})
}
/**
* Prevents that the click events gets called too often by fast clicking user
*/
@UiThread
fun View.setDebounceOnClickListener(listener: View.OnClickListener) {
this.setOnClickListener(object : View.OnClickListener {
private var lastClickTime: Long = 0
override fun onClick(v: View) {
if (SystemClock.elapsedRealtime() - lastClickTime < defaultDebounce) return
else listener.onClick(v)
lastClickTime = SystemClock.elapsedRealtime()
}
})
}
/**
* Prevents that the click events gets called too often by fast clicking user
*/
@UiThread
fun View.setDebounceOnClickListener(@IntRange(from = 0, to = Integer.MAX_VALUE.toLong()) debounceTime: Long = defaultDebounce, listener: View.OnClickListener) {
this.setOnClickListener(object : View.OnClickListener {
private var lastClickTime: Long = 0
override fun onClick(v: View) {
if (SystemClock.elapsedRealtime() - lastClickTime < debounceTime) return
else listener.onClick(v)
lastClickTime = SystemClock.elapsedRealtime()
}
})
}
@macsystems
Copy link
Copy Markdown
Author

import android.os.SystemClock
import android.view.View
import androidx.annotation.IntRange
import androidx.annotation.UiThread

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment