Debounce clicks on list items in the main screen

This commit is contained in:
Aidan Follestad 2018-11-30 14:25:52 -08:00
parent 3507aec3db
commit a8bcc60496
2 changed files with 50 additions and 6 deletions

View file

@ -12,6 +12,7 @@ import androidx.recyclerview.widget.RecyclerView
import com.afollestad.nocknock.R
import com.afollestad.nocknock.data.ServerModel
import com.afollestad.nocknock.data.textRes
import com.afollestad.nocknock.utilities.ui.onDebouncedClick
import kotlinx.android.synthetic.main.list_item_server.view.iconStatus
import kotlinx.android.synthetic.main.list_item_server.view.textInterval
import kotlinx.android.synthetic.main.list_item_server.view.textName
@ -24,10 +25,12 @@ typealias Listener = (model: ServerModel, longClick: Boolean) -> Unit
class ServerVH constructor(
itemView: View,
private val adapter: ServerAdapter
) : RecyclerView.ViewHolder(itemView), View.OnClickListener, View.OnLongClickListener {
) : RecyclerView.ViewHolder(itemView), View.OnLongClickListener {
init {
itemView.setOnClickListener(this)
itemView.onDebouncedClick {
adapter.performClick(adapterPosition, false)
}
itemView.setOnLongClickListener(this)
}
@ -46,10 +49,6 @@ class ServerVH constructor(
itemView.textInterval.text = model.intervalText()
}
override fun onClick(view: View) {
adapter.performClick(adapterPosition, false)
}
override fun onLongClick(view: View): Boolean {
adapter.performClick(adapterPosition, true)
return false

View file

@ -0,0 +1,45 @@
/*
* Licensed under Apache-2.0
*
* Designed and developed by Aidan Follestad (@afollestad)
*/
package com.afollestad.nocknock.utilities.ui
import android.view.View
import java.lang.System.currentTimeMillis
private const val DEFAULT_DEBOUNCE_INTERVAL = 750L
/** @author Aidan Follestad (@afollestad) */
abstract class DebouncedOnClickListener(
private val delayBetweenClicks: Long = DEFAULT_DEBOUNCE_INTERVAL
) : View.OnClickListener {
private var lastClickTimestamp = -1L
@Deprecated(
message = "onDebouncedClick should be overridden instead.",
replaceWith = ReplaceWith("onDebouncedClick(v)")
)
override fun onClick(v: View) {
val now = currentTimeMillis()
if (lastClickTimestamp == -1L || now >= (lastClickTimestamp + delayBetweenClicks)) {
onDebouncedClick(v)
}
lastClickTimestamp = now
}
abstract fun onDebouncedClick(v: View)
}
/** @author Aidan Follestad (@afollestad) */
fun View.onDebouncedClick(
delayBetweenClicks: Long = DEFAULT_DEBOUNCE_INTERVAL,
click: (view: View) -> Unit
) {
setOnClickListener(object : DebouncedOnClickListener(delayBetweenClicks) {
override fun onDebouncedClick(v: View) {
click(v)
}
})
}