深入解析ViewPager懒加载

深入解析ViewPager懒加载,第1张

ViewPager默认情况的加载,会默认预加载一个的布局到ViewPager中,这就时ViewPager的预加载。setOffscreenPageLimit可以通过这个方法去设置预加载布局的个数。

从上面可以看出,预加载的页面个数大于等于1。

在缓存数量更新的时候,要执行缓存方法polulate()。去看看里面做了啥事

前面提到了创建ViewPager.ItemInfo,这个是什么

注释①:调用instantiateItem来创建object,在FragmentPagerAdapter的instantiateItem这个方法中,创建的就是fragment。所以缓存的就是fragment,fragment在创建时,会有ui *** 作,网络 *** 作,在还未可见的时候,就去初始化fragment非常消耗性能,所以懒加载的方式来加载,不去缓存fragment。

ViewPager2

简单说就是将RecycleView再封装了一遍,然后协同FragmentStateAdapter将RecycleView的每个Item与Fragment绑定。

特性

支持从左到右,或者从上到下布局

由于适配基于的是RecyclerView.Adapter,所以内存优化也直接采用RecyclerView.Adapter的内存优化机制,相对于viewpager,内存优化更高效合理,且notifyDataSetChanged也更高效了。由于不用开发者自己实现内存和notifyDataSetChanged,也更简便了。 

相比ViewPager,ViewPager2修复了不能关闭预加载和更新Adapter不生效的痛点。

目前ViewPager2对Fragment支持只能用FragmentStateAdapter,FragmentStateAdapter在遇到预加载时,只会创建Fragment对象,不会把Fragment真正的加入到布局中,所以自带懒加载效果。

FragmentStateAdapter不会一直保留Fragment实例,回收的ItemView也会移除Fragment,所以得做好Fragment重建后恢复数据的准备。

FragmentStateAdapter在遇到offscreenPageLimit>0时,处理离屏Fragment和可见Fragment没有什么区别,所以无法通过setUserVisibleHint判断显示与否。

基本方法

部分核心方法使用参照RecycleView和ViewPager,如设置分割线addItemDecoration(),设置当前项setCurrentItem()等。

setAdapter() 设置适配器

setOrientation() 设置布局方向

setCurrentItem() 设置当前Item下标

beginFakeDrag() 开始模拟拖拽

fakeDragBy() 模拟拖拽中

endFakeDrag() 模拟拖拽结束

setUserInputEnabled() 设置是否允许用户输入/触摸

setOffscreenPageLimit()设置屏幕外加载页面数量

registerOnPageChangeCallback() 注册页面改变回调

setPageTransformer() 设置页面滑动时的变换效果

。。。还有好多。使用的时候大家可以具体看一下。

offscreenPageLimit()

不设置它则不会预加载,一旦设置了,由于limit必须>0,所以会进行预加载limit个页面

viewpager2的预加载在加载时已经准备好了View布局,但是没有加载到parent视图上,所以自带懒加载效果。 而viewpager加载的时候View已经添加到parent上。所以会走生命周期的方法。

从 初始化 方法可以看出,viewpager2支持的一些特性以及为什么。

RecyclerViewImpl

基于RecyclerView的二次封装,对触摸事件,初始化等进行封装。

LinearLayoutManagerImpl

使用LinearLayoutManager,所以拥有LinearLayoutManager的特性,可以垂直或者水平。也就引申出为什么后面可以设置水平或者垂直滑动

PageTransformerAdapter

用于监听pager的改变。

基于 RecyclerView.Adapter实现

类似recycleView的使用。

基于FragmentStateAdapter实现

两种方式实现viewPager不加载数据。只需要设置viewPager.setOffscreenPageLimit(3)表示三个界面之间来回切换都不会重新加载。使用Adapter,每次改变数据后重新设置Adapter。MyAdapter adapter = new MyAdapter()viewPager.setAdapter(adapter)即可。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/7815520.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-10
下一篇 2023-04-10

发表评论

登录后才能评论

评论列表(0条)

保存