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,转载请注明出处。
1、本站所有资源均从互联网上收集整理而来,仅供学习交流之用,因此不包含技术服务请大家谅解!
2、本站不提供任何实质性的付费和支付资源,所有需要积分下载的资源均为网站运营赞助费用或者线下劳务费用!
3、本站所有资源仅用于学习及研究使用,您必须在下载后的24小时内删除所下载资源,切勿用于商业用途,否则由此引发的法律纠纷及连带责任本站和发布者概不承担!
4、本站站内提供的所有可下载资源,本站保证未做任何负面改动(不包含修复bug和完善功能等正面优化或二次开发),但本站不保证资源的准确性、安全性和完整性,用户下载后自行斟酌,我们以交流学习为目的,并不是所有的源码都100%无错或无bug!如有链接无法下载、失效或广告,请联系客服处理!
5、本站资源除标明原创外均来自网络整理,版权归原作者或本站特约原创作者所有,如侵犯到您的合法权益,请立即告知本站,本站将及时予与删除并致以最深的歉意!
6、如果您也有好的资源或教程,您可以投稿发布,成功分享后有站币奖励和额外收入!
7、如果您喜欢该资源,请支持官方正版资源,以得到更好的正版服务!
8、请您认真阅读上述内容,注册本站用户或下载本站资源即您同意上述内容!
原文链接:https://www.dandroid.cn/archives/22903,转载请注明出处。


评论0