ViewPager最佳实践:Banner实现
预加载
界面还未显示时后台进行加载操作,节约显示时间提升体验,导致内存、流量消耗
懒加载
用的时候再加载,优化预加载的问题,大厂都会用
- setOffscreenPageLimit(0)无效,默认预加载导致// 预加载n页,默认为1,至少为1才有效
// View中onMeasure()先测量子布局,ViewPager先测量自己不会按照子布局参数设置 - xml设置布局宽高大小尺寸,onMeasuredDimension()// 第1期/公开课,自定义重写onMeasure()
- ※实现懒加载
源码分析
【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 叠在一起,下层被上层挡住的部分是看不见的,但还是会进行绘制。