You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RecyclerView滑动时如何获取被滑动ViewHolder的移动像素距离?

RecyclerView 获取被滑列表项 ViewHolder 像素位置实现方案

核心实现思路

1. 实时获取可见区域内 ViewHolder 及坐标

通过RecyclerView的LayoutManager可以直接拿到当前可见的列表项实例,再读取对应坐标即可:

  • 首先给RecyclerView添加滚动监听,在滑动回调中实时获取状态:
    recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
        override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
            super.onScrolled(recyclerView, dx, dy)
            val layoutManager = recyclerView.layoutManager as LinearLayoutManager
            // 可根据需求取第一个/最后一个可见项,或遍历所有可见项
            val firstVisiblePos = layoutManager.findFirstVisibleItemPosition()
            val targetItemView = layoutManager.findViewByPosition(firstVisiblePos) ?: return
            val targetViewHolder = recyclerView.getChildViewHolder(targetItemView)
            
            // 获取相对RecyclerView的像素坐标
            val relativeX = targetItemView.x
            val relativeY = targetItemView.y
            
            // 如需获取在手机屏幕的绝对坐标,使用如下方法
            val screenLocation = IntArray(2)
            targetItemView.getLocationOnScreen(screenLocation)
            val absoluteX = screenLocation[0]
            val absoluteY = screenLocation[1]
        }
    })
    

2. 监听滑入/滑出屏幕的 ViewHolder

如果需要捕捉刚被滑出/滑入屏幕的列表项,可以在上述onScrolled回调中增加坐标范围判断:

  • 垂直滚动场景下:当itemView.bottom < 0或者itemView.top > recyclerView.height时,说明该项完全滑出可见区域
  • 水平滚动场景下:当itemView.right < 0或者itemView.left > recyclerView.width时,说明该项完全滑出可见区域

注意事项

  1. 不要长期缓存ViewHolder实例,受RecyclerView复用机制影响,缓存的实例后续可能绑定其他位置的数据,每次需要时通过LayoutManager实时获取即可
  2. 若列表项添加了入场/退场动画、ItemAnimator,滑动过程中取到的坐标可能是动画中间值,需要准确值建议监听动画结束回调后再读取
  3. 若使用了StaggeredGridLayoutManager,调用findFirstVisibleItemPositions()/findLastVisibleItemPositions()获取多列的可见位置即可

内容的提问来源于stack exchange,提问作者Rodrigo Barboza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 23:06:02