mirror of
https://github.com/afollestad/nock-nock.git
synced 2025-04-20 19:45:17 +00:00
Debounce clicks on list items in the main screen
This commit is contained in:
parent
3507aec3db
commit
a8bcc60496
2 changed files with 50 additions and 6 deletions
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
})
|
||||
}
|
Loading…
Add table
Reference in a new issue