android recycleview 滚动到指定位置

recycleview几种滚动方式区别:

1. smoothScrollToPosition(int position)

  • 特点 :平滑滚动到指定位置,但 无法精确控制偏移
  • 行为 :系统会自动决定如何滚动,通常将目标位置滚动到可见区域,但具体位置由布局管理器决定
  • 适用场景 :只关心目标项可见,不关心具体显示位置的场景

2. scrollToPosition(int position)

  • 特点 : 瞬间滚动 到指定位置,没有动画效果
  • 行为 :直接定位,目标项会被滚动到屏幕边缘(顶部或底部,取决于布局方向)
  • 适用场景 :需要立即定位且不关心过渡动画的场景

3. smoothScrollBy(int dx, int dy)

  • 特点 :平滑滚动指定的像素距离, 基于当前位置 进行相对滚动
  • 行为 :提供平滑的滚动动画,可控制滚动的距离和方向
  • 适用场景 :需要精确控制滚动距离的场景,如微调位置

4. scrollBy(int dx, int dy)

  • 特点 : 瞬间滚动 指定的像素距离,没有动画效果
  • 行为 :基于当前位置进行相对滚动,直接跳转,无动画
  • 适用场景 :需要精确控制滚动距离但不需要动画的场景

5. scrollToPositionWithOffset(int position, int offset)

  • 特点 : 瞬间滚动 到指定位置,并 精确控制偏移量
  • 行为 :将指定位置的item滚动到视图中,并设置其顶部(或左侧)与RecyclerView边缘的偏移像素值
  • 适用场景 :需要将目标项滚动到特定偏移位置的场景

/**
 * 滑动到指定位置,使用更可靠的位置定位方法
 */
fun smoothMove2ToPosition(recyclerView: RecyclerView, position: Int, currentWindowNeedScroll: Boolean = true, offset: Int = 0, childIndex: Int) {
    if (position < 0 || position >= (recyclerView.adapter?.itemCount ?: 0)) {
        return
    }
    
    // 确保LayoutManager是LinearLayoutManager
    val layoutManager = recyclerView.layoutManager as? androidx.recyclerview.widget.LinearLayoutManager ?: return
    
    // 获取第一个可见位置和最后一个可见位置
    val firstVisibleItemPosition = layoutManager.findFirstVisibleItemPosition()
    val lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition()
    
    // 如果目标位置在可见区域内
    if (position in firstVisibleItemPosition..lastVisibleItemPosition) {
        LogUtil.e("smoothMove2ToPosition---目标位置在可见区域内")
        if (!currentWindowNeedScroll) return
        
        // 获取目标位置的视图
        val targetView = layoutManager.findViewByPosition(position)
        if (targetView != null) {
            // 计算需要滚动的距离
            val scrollDistance = targetView.top - offset
            // 直接使用smoothScrollBy滚动到目标位置
            recyclerView.smoothScrollBy(0, scrollDistance)
        }
    } else {
        // 目标位置在可见区域外,使用scrollToPositionWithOffset进行精确定位
        LogUtil.e("smoothMove2ToPosition---目标位置在可见区域外,使用精确滚动")
        
        // 对于可见区域外的位置,使用scrollToPositionWithOffset可以直接定位到正确的位置
        // 这是LinearLayoutManager提供的更可靠的定位方法
        layoutManager.scrollToPositionWithOffset(position, offset)
        
        // 添加一个小延迟来确保视图已经布局完成
        recyclerView.postDelayed({
            // 再次检查目标视图是否已经正确定位
            val targetView = layoutManager.findViewByPosition(position)
            if (targetView != null && targetView.isAttachedToWindow) {
                // 计算最终的偏移量
                val topDiff = targetView.top - offset
                // 如果有微小的偏移,进行微调
                if (abs(topDiff) > 5) {
                    recyclerView.smoothScrollBy(0, topDiff)
                }
            } else {
                // 如果无法获取目标视图,尝试再次使用scrollToPositionWithOffset
                layoutManager.scrollToPositionWithOffset(position, offset)
            }
        }, 200) // 延迟检查
    }
}
阅读全文
下载说明:
1、本站所有资源均从互联网上收集整理而来,仅供学习交流之用,因此不包含技术服务请大家谅解!
2、本站不提供任何实质性的付费和支付资源,所有需要积分下载的资源均为网站运营赞助费用或者线下劳务费用!
3、本站所有资源仅用于学习及研究使用,您必须在下载后的24小时内删除所下载资源,切勿用于商业用途,否则由此引发的法律纠纷及连带责任本站和发布者概不承担!
4、本站站内提供的所有可下载资源,本站保证未做任何负面改动(不包含修复bug和完善功能等正面优化或二次开发),但本站不保证资源的准确性、安全性和完整性,用户下载后自行斟酌,我们以交流学习为目的,并不是所有的源码都100%无错或无bug!如有链接无法下载、失效或广告,请联系客服处理!
5、本站资源除标明原创外均来自网络整理,版权归原作者或本站特约原创作者所有,如侵犯到您的合法权益,请立即告知本站,本站将及时予与删除并致以最深的歉意!
6、如果您也有好的资源或教程,您可以投稿发布,成功分享后有站币奖励和额外收入!
7、如果您喜欢该资源,请支持官方正版资源,以得到更好的正版服务!
8、请您认真阅读上述内容,注册本站用户或下载本站资源即您同意上述内容!
原文链接:https://www.dandroid.cn/archives/22903,转载请注明出处。
0

评论0

显示验证码
没有账号?注册  忘记密码?