Skip to content

Instantly share code, notes, and snippets.

@projectdelta6
Last active June 15, 2021 15:43
Show Gist options
  • Save projectdelta6/8859e929cb9a7d60e042b47f1860f125 to your computer and use it in GitHub Desktop.
Save projectdelta6/8859e929cb9a7d60e042b47f1860f125 to your computer and use it in GitHub Desktop.
//package ...
import android.content.Context
import android.view.GestureDetector
import android.view.MotionEvent
import android.view.View
import androidx.recyclerview.widget.RecyclerView
fun RecyclerView.setOnItemClickListener(onItemClickListener: (itemView: View, position: Int) -> Unit) {
addOnItemTouchListener(
RecyclerItemClickListener(
context,
this,
onItemClickListener = onItemClickListener))
}
fun RecyclerView.setOnItemLongClickListener(onItemLongClickListener: (itemView: View, position: Int) -> Unit) {
addOnItemTouchListener(
RecyclerItemClickListener(
context,
this,
onItemLongClickListener = onItemLongClickListener))
}
fun RecyclerView.setOnItemClickListeners(
onItemClickListener: (itemView: View, position: Int) -> Unit,
onItemLongClickListener: (itemView: View, position: Int) -> Unit) {
addOnItemTouchListener(
RecyclerItemClickListener(
context,
this,
onItemClickListener = onItemClickListener,
onItemLongClickListener = onItemLongClickListener))
}
private class RecyclerItemClickListener(
context: Context,
recyclerView: RecyclerView,
private val onItemClickListener: ((itemView: View, position: Int) -> Unit)? = null,
private val onItemLongClickListener: ((itemView: View, position: Int) -> Unit)? = null) :
RecyclerView.OnItemTouchListener {
var mGestureDetector: GestureDetector =
GestureDetector(context, object : GestureDetector.SimpleOnGestureListener() {
override fun onSingleTapUp(e: MotionEvent): Boolean {
return true
}
override fun onLongPress(e: MotionEvent) {
val child = recyclerView.findChildViewUnder(e.x, e.y)
if (child != null && onItemLongClickListener != null) {
onItemLongClickListener.invoke(
child,
recyclerView.getChildAdapterPosition(child))
}
}
})
override fun onInterceptTouchEvent(view: RecyclerView, e: MotionEvent): Boolean {
val childView = view.findChildViewUnder(e.x, e.y)
if (childView != null && onItemClickListener != null && mGestureDetector.onTouchEvent(e)) {
onItemClickListener.invoke(childView, view.getChildAdapterPosition(childView))
return true
}
return false
}
override fun onTouchEvent(view: RecyclerView, motionEvent: MotionEvent) {}
override fun onRequestDisallowInterceptTouchEvent(disallowIntercept: Boolean) {}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment