java - 带有滚动视图的 Viewpager,保持滚动位置跨页面同步的最佳方法?
问题描述
我正在使用 viewpager 来切换片段。每个片段都有一个滚动视图,我希望所有页面保持同步。实现这一目标的最佳方法是什么?
解决方案
主要问题是片段间通信,可能最好是在片段之间有一个共享视图模型(还有其他方法,共享视图模型方法记录在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 将存储当前滚动位置。
推荐阅读
- python - 如何让 sqlite3 存储 tzinfo?
- bash - 尝试将 curl 脚本从 Linux 转换为 Windows,以便能够下载 Google Drive 大文件
- sas - 我如何从存储为 630 和 2030 的数字中获取小时,这分别表示 06:30 和 20:30
- amazon-web-services - 即使安全规则允许,我的容器也无法通过 Internet 访问
- laravel - 使用关联方法更新 belongsTo 关系时如何修复“字段 {$foreign_key} 没有默认值”错误
- mysql - 如何从 aws rds mysql master 在 gcp cloud sql 副本上添加用户
- gpu - Core ML 中 fp16 计算与 fp32 计算的区别
- python - 如何将 pickle.loads 从 Python 2 转换为 Python 3?
- reactjs - 对如何正确地将道具传递给后代组件感到困惑
- c++ - 由于将位字段类型转换为整数,Valgrind 未初始化字节错误