Android Java中跨RecyclerView拖拽item时如何触发主RecyclerView滚动
嵌套RecyclerView拖拽时主列表自动滚动实现方案
核心实现逻辑
监听拖拽事件的实时坐标,当拖拽触点进入屏幕顶部/底部的预设触发区域时,定时触发主RecyclerView的平滑滚动,触点离开触发区域或拖拽结束时立即停止滚动。
具体实现步骤
- 提前定义滚动相关参数和全局变量
// 触发滚动的上下边界阈值,此处取屏幕高度的1/10,可自行调整 private val scrollTriggerThreshold by lazy { resources.displayMetrics.heightPixels / 10 } // 单次滚动的像素值,控制滚动速度 private const val SCROLL_SPEED = 15 private val scrollHandler = Handler(Looper.getMainLooper()) private var currentScrollOffset = 0 // 滚动执行任务 private val scrollRunnable = object : Runnable { override fun run() { // 滚动前判断边界,避免无意义滚动 val canScrollUp = mainRecyclerView.canScrollVertically(-1) val canScrollDown = mainRecyclerView.canScrollVertically(1) if ((currentScrollOffset < 0 && canScrollUp) || (currentScrollOffset > 0 && canScrollDown)) { mainRecyclerView.scrollBy(0, currentScrollOffset) } // 16ms执行一次,匹配60帧刷新频率 scrollHandler.postDelayed(this, 16) } }
- 在拖拽事件回调中处理滚动触发逻辑
在你当前使用的OnDragListener的事件回调中添加如下判断:
override fun onDrag(v: View, event: DragEvent): Boolean { return when (event.action) { DragEvent.ACTION_DRAG_STARTED -> { // 拖拽开始时重置滚动状态 currentScrollOffset = 0 scrollHandler.removeCallbacks(scrollRunnable) true } DragEvent.ACTION_DRAG_LOCATION -> { val dragY = event.rawY // 取相对于屏幕的Y坐标,适配多布局场景 when { // 进入顶部触发区域,向上滚动 dragY < scrollTriggerThreshold -> { currentScrollOffset = -SCROLL_SPEED scrollHandler.removeCallbacks(scrollRunnable) scrollHandler.post(scrollRunnable) } // 进入底部触发区域,向下滚动 dragY > resources.displayMetrics.heightPixels - scrollTriggerThreshold -> { currentScrollOffset = SCROLL_SPEED scrollHandler.removeCallbacks(scrollRunnable) scrollHandler.post(scrollRunnable) } // 离开触发区域,停止滚动 else -> { currentScrollOffset = 0 scrollHandler.removeCallbacks(scrollRunnable) } } true } DragEvent.ACTION_DROP, DragEvent.ACTION_DRAG_ENDED -> { // 拖拽结束/放置完成时停止滚动,避免内存泄漏 scrollHandler.removeCallbacks(scrollRunnable) currentScrollOffset = 0 true } else -> false } }
- 子RecyclerView事件适配
如果子RecyclerView消费了拖拽事件导致主列表收不到坐标更新,可在子RecyclerView的onDragEvent方法中返回false,或者直接将拖拽事件转发给主RecyclerView的OnDragListener处理。
内容的提问来源于stack exchange,提问作者Ali Sidhu
相关产品推荐
相关产品推荐

