ViewPager
private static final int DEFAULT_OFFSCREEN_PAGES = 1;
public void setOffscreenPageLimit(int limit) {
if (limit < DEFAULT_OFFSCREEN_PAGES) {//不允许小于1
Log.w(TAG, "Requested offscreen page limit " + limit + " too small; defaulting to "
- DEFAULT_OFFSCREEN_PAGES);
limit = DEFAULT_OFFSCREEN_PAGES;
}
if (limit != mOffscreenPageLimit) {
mOffscreenPageLimit = limit;
populate();
}
}
ViewPager强制预加载的逻辑在Fragment配合ViewPager使用时依然存在.
Fragment懒加载前因后果
先说PagerAdapter:
PagerAdapter常用方法如下:
-
instantiateItem(ViewGroup container, int position)初始化ItemView,返回需要添加ItemView
-
destroyItem(iewGroup container, int position, Object object)销毁ItemView,移除指定的ItemView
-
isViewFromObject(View view, Object object)View和Object是否对应
-
setPrimaryItem(ViewGroup container, int position, Object object) 当前页面的主Item
-
getCount()获取Item个数
先说setPrimaryItem(ViewGroup container, int position, Object object),该方法表示当前页面正在显示主要Item,何为主要Item?如果预加载的ItemView已经划入屏幕,当前的PrimaryItem依然不会改变,除非新的ItemView完全划入屏幕,且滑动已经停止才会判断;
由于ViewPager不可避免的进行布局预加载,造成PagerAdapter必须提前调用instantiateItem(ViewGroup container, int position)方法,instantiateItem()是创建ItemView的唯一入口方法,所以PagerAdapter的实现类FragmentPagerAdapter和FragmentStatePagerAdapter必须抓住该方法进行Fragment对象的创建;
碰巧的是,FragmentPagerAdapter和FragmentStatePagerAdapter一股脑的在instantiateItem()中进行创建且进行add或attach操作,并没有在setPrimaryItem()方法中对Fragment进行操作;
因此,预加载会导致不可见的Fragment一股脑的调用onCreate、onCreateView、onResume等方法,用户只能通过Fragment.setUserVisibleHint()方法进行识别;
大多数的懒加载都是对Fragment做手脚,结合生命周期方法和setUserVisibleHint状态,控制数据延迟加载,而布局只能提前进入;
ViewPager2 基本使用
build.gradle引入
implementation ‘androidx.viewpager2:viewpager2:1.0.0-alpha04’
布局文件添加
<androidx.viewpager2.widget.ViewPager2
android:id