Android RecyclerView is based on GestureDetector, SimpleOnItemTouchListener simple OnItemClick(position) implementation, Kotlin
import android.view.GestureDetector
import android.view.GestureDetector.SimpleOnGestureListener
import android.view.MotionEvent
import android.view.View
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.SimpleOnItemTouchListener
open class RVOnItemClickListener() : SimpleOnItemTouchListener() {
private var mGestureDetector: GestureDetector? = null
constructor(recyclerView: RecyclerView) : this() {
mGestureDetector =
GestureDetector(recyclerView.context, object : SimpleOnGestureListener() {
//长按
override fun onLongPress(e: MotionEvent) {
super.onLongPress(e)
val childView = recyclerView.findChildViewUnder(e.x, e.y)
if (childView != null) {
val position = recyclerView.getChildLayoutPosition(childView)
onItemLongClick(position, childView)
}
}
//单击
override fun onSingleTapUp(e: MotionEvent): Boolean {
val childView = recyclerView.findChildViewUnder(e.x, e.y)
if (childView != null) {
val position = recyclerView.getChildLayoutPosition(childView)
onItemClick(position, childView)
return true
}
return super.onSingleTapUp(e)
}
})
}
override fun onInterceptTouchEvent(rv: RecyclerView, e: MotionEvent): Boolean {
return mGestureDetector?.onTouchEvent(e)!!
}
//长按
open fun onItemLongClick(position: Int, view: View?) {
}
//单击事件接口
open fun onItemClick(position: Int, view: View?) {
}
}
How to use the upper RecyclerView:
val mRecyclerView = findViewById<RecyclerView>(R.id.recycler_view)
val layoutManager = GridLayoutManager(this, GRID_SIZE)
mRecyclerView?.layoutManager = layoutManager
val adapter = MyAdapter()
mRecyclerView?.adapter = adapter
mRecyclerView.addOnItemTouchListener(object : RVOnItemClickListener(mRecyclerView) {
override fun onItemClick(position: Int, view: View?) {
//单击回调
}
})
The above implementation is more concise than the following implementation.