Viewpager+Fragment的懒加载
Viewpager+FragmentPagerAdapter/FragmentStatePagerAdapter实现滚动视图,在App中是很常见的设计,有时候在Fragment页面较多的情况下,需要在页面可见的情况,才对当前Fragment进行加载,也就是常说的懒加载。
这里直接谈谈现在如今的方案:
FragmentPagerAdapter构造函数增加了behavior参数,假如设置为BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT参数,那么,当Viewpager滑动的时候,只有当前正在显示的Fragment会回调onResume()方法。即可以直接在onResume()函数中进行数据加载和其他初始化的操作,很方便。
它是怎么做到的呢?
在AndroidX下,源码上针对FragmentTransaction做了部分修改,增加了setMaxLifecycle函数,该函数可以设置Fragent的生命周期的状态。
ViewPager在滚动的时候,调用setPrimaryItem方法:
@Override
public void setPrimaryItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
Fragment fragment = (Fragment)object;
if (fragment != mCurrentPrimaryItem) {
if (mCurrentPrimaryItem != null) {
mCurrentPrimaryItem.setMenuVisibility(false);
if (mBehavior == BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
if (mCurTransaction == null) {
mCurTransaction = mFragmentManager.beginTransaction();
}
mCurTransaction.setMaxLifecycle(mCurrentPrimaryItem, Lifecycle.State.STARTED);
} else {
mCurrentPrimaryItem.setUserVisibleHint(false);
}
}
fragment.setMenuVisibility(true);
if (mBehavior == BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
if (mCurTransaction == null) {
mCurTransaction = mFragmentManager.beginTransaction();
}
mCurTransaction.setMaxLifecycle(fragment, Lifecycle.State.RESUMED);
} else {
fragment.setUserVisibleHint(true);
}
mCurrentPrimaryItem = fragment;
}
}
查看上述代码,可见,如果将behavior参数设置为BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT,会通过函数setMaxLifecycle,现将当前的Fragment设置为STARTED状态,再将需要显示的Fragment设置为RESUMED状态。因此只有当前的可见的Fragment才能回调onResume函数。