首页 > 解决方案 > 带有滚动视图的 Viewpager,保持滚动位置跨页面同步的最佳方法?

问题描述

我正在使用 viewpager 来切换片段。每个片段都有一个滚动视图,我希望所有页面保持同步。实现这一目标的最佳方法是什么?

标签: javaandroidandroid-viewpagerscrollview

解决方案


主要问题是片段间通信,可能最好是在片段之间有一个共享视图模型(还有其他方法,共享视图模型方法记录在https://androidwave.com/passing-data-between-fragments/

然后,您将使用https://developer.android.com/reference/android/view/View.html#getScrollY%28%29在共享视图模型中存储当前滚动视图的数量,然后使用该值设置新视图滚动金额https://developer.android.com/reference/android/view/View.html#setScrollY(int)

如果您使用的是现代版本的 Viewpager(https://developer.android.com/reference/androidx/viewpager/widget/ViewPager或 Viewpager2),这将保持片段的正确生命周期,只有当前显示的片段处于Resumed状态Paused如果存在,其他人则处于状态。有关详细信息,请参阅https://developer.android.com/reference/androidx/fragment/app/FragmentStatePagerAdapter#BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT

由于不能保证其他 Fragment 存在,并且尝试实时滚动其他 Fragment 计算成本高且复杂,因此您只需使用生命周期来管理它。

因此,在onPause方法中的每个片段中,您都会将getScrollY值存储在共享视图模型中。
然后在onResume方法中的每个片段中,您将从setScrollY共享视图模型中的值中获取。

因此,当您启动页面切换并在传入页面上设置滚动位置时,viewpager 将存储当前滚动位置。


推荐阅读