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时,说明该项完全滑出可见区域
注意事项
- 不要长期缓存ViewHolder实例,受RecyclerView复用机制影响,缓存的实例后续可能绑定其他位置的数据,每次需要时通过LayoutManager实时获取即可
- 若列表项添加了入场/退场动画、ItemAnimator,滑动过程中取到的坐标可能是动画中间值,需要准确值建议监听动画结束回调后再读取
- 若使用了StaggeredGridLayoutManager,调用
findFirstVisibleItemPositions()/findLastVisibleItemPositions()获取多列的可见位置即可
内容的提问来源于stack exchange,提问作者Rodrigo Barboza
相关产品推荐
相关产品推荐

