解决办法相对比较简单,正好今天有人问到这个问题,所以把我的做法分享出来,即做一下手势分发即可,对此我继承 RecyclerView 做了 dispatchTouchEvent() 方法的重写,我使用了 Kotlin 编程语言,阅读起来应该不是什么问题,读者有需要的话,可以自行改成其他语言。原理就是当检测到有设置 clipToPadding = false 的时候,进行触摸点位置判断,在 dispatchTouchEvent() 方法返回 false 即表示对当前触摸事件不感兴趣,事件可将手势往下层传递,全部的代码如下:
public class GenerousRecyclerView : RecyclerView { var mScrollY: Int = 0 val DEBUG = false public constructor(context: Context) : this(context, null) public constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0) public constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) { addOnScrollListener(object : RecyclerView.OnScrollListener() { override fun onScrolled(recyclerView: RecyclerView?, dx: Int, dy: Int) { super.onScrolled(recyclerView, dx, dy) mScrollY += dy } }) } override fun dispatchTouchEvent(ev: MotionEvent): Boolean { if (DEBUG) println("mScrollY: $mScrollY paddingTop: $paddingTop") return if (clipToPadding == false && mScrollY < paddingTop && ev.y < paddingTop) { false } else { super.dispatchTouchEvent(ev) } } }