ViewPager源码学习

博客探讨了ViewPager的工作原理,包括预加载和懒加载策略。预加载可以在界面显示前加载内容,但也可能导致资源消耗。懒加载则在需要时加载,优化用户体验。源码分析部分提到了ViewPager2如何借助LifeCycle实现懒加载。此外,讨论了常见的问题,如View的渲染步骤和过度绘制。最后,提出了基于ViewPager和RecyclerView实现水平滚动分页菜单的待办事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ViewPager最佳实践:Banner实现

预加载

界面还未显示时后台进行加载操作,节约显示时间提升体验,导致内存、流量消耗

懒加载

用的时候再加载,优化预加载的问题,大厂都会用

  1. setOffscreenPageLimit(0)无效,默认预加载导致// 预加载n页,默认为1,至少为1才有效
    // View中onMeasure()先测量子布局,ViewPager先测量自己不会按照子布局参数设置
  2. xml设置布局宽高大小尺寸,onMeasuredDimension()// 第1期/公开课,自定义重写onMeasure()
  3. ※实现懒加载
源码分析
【ViewPager extends ViewGroup】
onMeasure()|setOffscreenPageLimit()|smoothScrollTo()|...
——populate()// 关键方法,把所有操作交给mAdapter
————mAdapter.startUpdate(this);// 开始适配
————curItem = addNewItem(mCurItem, curIndex);
——————// 创建适配的Item数据
——————ii.object = mAdapter.instantiateItem(this, position);
———————— -->【FragmentPagerAdapter】-->instantiateItem()
——————————fragment.setUserVisibleHint(false);// Fragment生命周期函数之前就执行
——————mAdapter.destroyItem(this, pos, ii.object);// 销毁适配的Item数据
——————mAdapter.setPrimaryItem(this, mCurItem, curItem.object);// 设置当前显示的Item
———————— -->【FragmentPagerAdapter】-->setPrimaryItem()
——————————mCurrentPrimaryItem.setUserVisibleHint(false);
——————————fragment.setUserVisibleHint(true);
——————mAdapter.finishUpdate(this);// 通过事务的方式,执行生命周期函数
————FragmentStatePagerAdapter// 不可以缓存
————FragmentPagerAdapter// 可以缓存
ViewPager2(RecyclerView)
  • setMaxLifeCycle()//解决懒加载问题,用LifeCycle对Fragment生命周期的管理
  • 执行onCreateView()后不会执行onResum()来达到懒加载
常见问题
  • 一个 View 要渲染出来,需要经过哪几个步骤呢?
  • 这些步骤各自对应了一个回调方法,对 View 的什么操作会触发对这些回调方法的调用呢?或者说,不同的操作会触发不同的调用吗,比如有的调用,有的不调用?
  • 如果说 TextView 大小固定呢?
  • 除了在 Activity 创建的时候,后续对 View 的哪些操作会触发这些回调方法呢?(这里确实没复习到,现场通过 TextView 举例结合了这三个阶段的回调方法名开始猜)
  • 除了绘制,View 还有一些事件的传递机制,有了解吗?
  • 过程中的几个关键过程回调是哪几个呢?
  • 有听说过“过度绘制”吗?
    两个 View 叠在一起,下层被上层挡住的部分是看不见的,但还是会进行绘制。
TODO

基于viewPager+recyclerview实现的水平滚动分页菜单

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小山研磨代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值