ViewPager2预加载和缓存
ViewPager2预加载即RecyclerView的预加载,代码在RecyclerView的GapWorker中,这个知识可能有些同学不是很了解,推荐先看这篇博客
https://medium.com/google-developers/recyclerview-prefetch-c2f269075710
在ViewPager2上默认开启预加载,表现形式是在拖动控件或者Fling时,可能会预加载一条数据;下面是预加载的示意图:
如何关闭预加载?
((RecyclerView)viewPager.getChildAt(0))
.getLayoutManager().setItemPrefetchEnabled(false);
预加载的开关在LayoutManager上,只需要获取LayoutManager并调用setItemPrefetchEnabled()即可控制开关;
ViewPager2默认会缓存2条ItemView,而且在最新的RecyclerView中可以自定义缓存Item的个数;
RecyclerView
public void setItemViewCacheSize(int size) {
mRecycler.setViewCacheSize(size);
}
小结:
预加载和缓存在View层面没有本质的区别,都是已经准备了布局,但是没有加载到parent上;预加载和离屏加载在View层面有本质的区别,离屏加载的View已经添加到parent上;
提前加载对Adapter影响
所谓的提前加载,是指当前position不可见但加载了布局,包括上面说的预加载和离屏加载,下面先介绍一下Adapter:
ViewPager2的Adapter本质上是RecyclerView.Adapter,下面列举常用方法:
-
onCreateViewHolder(ViewGroup parent, int viewType)创建ViewHolder
-
onBindViewHolder(VH holder, int position)绑定ViewHolder
-
onViewRecycled(VH holder)当View被回收
-
onViewAttachedToWindow(VH holder)当前View加载到窗口
-
onViewDetachedFromWindow(VH holder)当前View从窗口移除
-
getItemCount()//获取Item个数
下面主要针对ItemView的创建来说,暂不讨论回收的情况;
-
onBindViewHolder 预加载和离屏加载都会调用
-
onViewAttachedToWindow 离屏加载ItemView会调用,可见ItemView会调用
-
onViewDetachedFromWindow 从可见到不可见的ItemView(除离屏中)必定调用
小结:
预加载和缓存在Adapter层面没有区别,都会调用onBindViewHolder方法;预加载和离屏加载在Adapter层面有本质的区别,离屏加载的View会调用onViewAttachedToWindow;
ViewPager2对Fragment支持
目前,ViewPager2对Fragment的支持只能使用FragmentStateAdapter,使用起来也是非常简单:
默认情况下,ViewPager2是开启预加载关闭离屏加载的,这种情况下,切换页面对Fragment生命周如何?