转载

解决 RecyclerView 使用 paddingTop & clipToPadding = false 时,上方透明区域点击事件无法下传

解决办法相对比较简单,正好今天有人问到这个问题,所以把我的做法分享出来,即做一下手势分发即可,对此我继承 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)   }  } } 
正文到此结束
Loading...