ViewPager2启动时同时加载两个子项数据导致卡顿,如何设置仅加载当前子项?
ViewPager2 预加载多余页面卡顿问题解决方案
问题根因
ViewPager2 内置默认离屏加载阈值为 1,只要当前页面处于可见状态,就会自动预加载左右各1个相邻页面的内容,你遇到的启动时同时加载第1、2两个页面数据的问题就是该默认机制导致的。
解决方案
方案1:修改离屏缓存阈值(仅AndroidX ViewPager2 1.1.0及以上版本支持)
ViewPager2从1.1.0-alpha01版本开始支持传入0值关闭离屏预加载,仅保留当前可见页面的加载逻辑。
- 代码示例:
// Kotlin 写法 yourViewPager2.offscreenPageLimit = 0
// Java 写法 yourViewPager2.setOffscreenPageLimit(0);
依赖版本过低的话需要先升级build.gradle中的依赖配置,参考版本:
implementation "androidx.viewpager2:viewpager2:1.1.0"
方案2:子页面懒加载适配(兼容所有ViewPager2版本)
如果不方便升级依赖,可以在ViewPager2的子Fragment中增加懒加载逻辑,仅当页面对用户可见时才触发数据加载:
- 增加加载标记位避免数据重复加载,结合页面可见状态判断触发逻辑
- 代码示例:
class PagerChildFragment : Fragment() { // 标记数据是否已经加载过,避免重复触发 private var isDataLoaded = false override fun onResume() { super.onResume() // 仅当页面可见且未加载过数据时执行加载逻辑 if (!isDataLoaded && userVisibleHint) { loadBusinessData() isDataLoaded = true } } private fun loadBusinessData() { // 替换为你实际的业务数据加载逻辑 } }
方案3:优化适配器加载逻辑
- 不要在Adapter的
onCreateViewHolder、onBindViewHolder生命周期中执行耗时的IO操作、复杂计算逻辑,耗时逻辑统一移到数据加载完成后异步执行 - 子页面布局复杂度高的话可以开启RecyclerView缓存优化:
yourViewPager2.apply { (adapter as? RecyclerView.Adapter)?.setHasStableIds(true) // 根据实际页面数量调整缓存大小,减少重复创建ViewHolder的消耗 setItemViewCacheSize(2) }
内容的提问来源于stack exchange,提问作者HASSNAIN NADEEM
相关产品推荐
相关产品推荐

