recyclerView雖然沒有像listView那樣提供了一個onItemClickListener,可是提供了一個觸摸事件OnItemTouchListener, 同時,提供了一個findChildViewUnder(x,y)的API,能夠根據觸摸的座標獲得ItemView,咱們再利用getChildAdapterPosition()獲得 手指觸摸到的位置,這裏再介紹一個API,GestureDetector.SimpleOnGestureListener,利用它,咱們能夠很方便的實現單擊和長按事件。 新建一個文件RecyclerItemClickListener,實現RecyclerView.OnItemTouchListener,再新建一個文件,OnItemClickListener,裏面有兩個須要複寫的接口bash
// 由於長按事件不經常使用,這裏咱們給他個默認實現
interface OnItemClickListener {
fun onItemClick(view: View, position: Int)
fun onItemLongClick(view: View, position: Int){}
}
複製代碼
class RecyclerItemClickListener(context: Context, recyclerView: RecyclerView, var listener: OnItemClickListener) : RecyclerView.OnItemTouchListener {
var gestureDetector = GestureDetector(context, object : GestureDetector.SimpleOnGestureListener() {
override fun onSingleTapUp(e: MotionEvent): Boolean {
val child = recyclerView.findChildViewUnder(e.x, e.y)
if (child != null && listener != null) {
listener?.onItemClick(child, recyclerView.getChildAdapterPosition(child))
}
return true
}
override fun onLongPress(e: MotionEvent) {
val child = recyclerView.findChildViewUnder(e.x, e.y)
if (child != null && listener != null) {
listener?.onItemLongClick(child, recyclerView.getChildAdapterPosition(child))
}
}
})
override fun onInterceptTouchEvent(rv: RecyclerView, e: MotionEvent): Boolean {
val childView = rv.findChildViewUnder(e.x, e.y)
if (childView != null && listener != null && gestureDetector!!.onTouchEvent(e)) {
listener?.onItemClick(childView, rv.getChildAdapterPosition(childView))
return true
}
return false
}
override fun onTouchEvent(rv: RecyclerView, e: MotionEvent) {
}
override fun onRequestDisallowInterceptTouchEvent(disallowIntercept: Boolean) {
}
}
複製代碼
使用:ide
recyclerView?.let{
it.addOnItemTouchListener(RecyclerItemClickListener(this,it1, object : OnItemClickListener {
override fun onItemClick(view: View, position: Int) {
// 處理點擊事件
}
}))
}
複製代碼