如何給RecyclerView高效的設置點擊事件?

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) {
                        // 處理點擊事件
                    }
                }))
}
複製代碼
相關文章
相關標籤/搜索