版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Leo_eight/article/details/51031346
把Fragment装进ViewPager, 当启动ViewPager所在的Activity时, 默认会预加载两个Fragment. 例如, ViewPager显示的第一个Fragment是Fragment1, 会自动加载下一个的Fragment.
我把四个Fragment装进ViewPager, 并监听四个Fragment的生命周期, 如下图:
从上图可以看到, Fragment2预加载了.
接下来, 向右滑动一下:
同样, Fragment3也预加载了. 再滑到第三个Fragment试试:
咦? Fragment1走完生命周期了!! 可以得出结论:
ViewPager默认会预加载滑动方向的下一个Fragment, 并最多同时加载3个Fragment, 即相邻的左右两个Fragment都加载了.
为了证明这个结论, 再滑到第四个Fragment试试, 如果结论正确, Fragment2会走完生命周期:
果然和我们预想的一样!
但有时我们想同时加载多个Fragment, 怎么办? 只需要简单的一行代码:
<span style="font-size:14px;color:#009900;"><strong>ViewPager.setOffscreenPageLimit(int limit)</strong></span>
那么, 但有时又不想同时加载多个Fragment, 如果加载任务比较重量级, 会导致卡顿, 影响用户体验, 该怎么办? 此时就需要用到下面两个方法来延时加载Fragment:
<span style="font-size:14px;color:#009900;"><strong>boolean Fragment.getUserVisibleHint() // 当Fragment可见时, 返回true, 否则返回false</strong></span>
<span style="font-size:14px;color:#009900;"><strong>void Fragment.setUserVisibleHint(boolean isVisibleToUser) // 设置Fragment的可见状态</strong></span>
只用写一个类继承Fragment, 实现当该Fragment可见时, 才进行加载任务:
<span style="font-size:14px;color:#009900;"><strong>/**
* 延时加载Fragment
*/
public abstract class BaseFragment extends Fragment{
protected boolean isVisible;
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if(getUserVisibleHint()) { // 如果可见
isVisible = true;
onVisible();
}else {
isVisible = false;
onInvisible();
}
}
private void onInvisible() {
}
private void onVisible() {
lazyLoad();
}
/**
* 具体的延时加载任务交给子类具体实现
*/
protected abstract void lazyLoad();
}</strong></span>
我们让Fragment3继承该类, 并在lazyLoad方法打印一些信息试试结果:
<span style="font-size:14px;color:#009900;"><strong>@Override
protected void lazyLoad() {
// dosomething
Log.i(TAG, "****lazyLoad");
}</strong></span>
我滑到Fragment2时, lazyLoad没有执行
再滑到Fragment3, 看看输出:
结果很明了了!! 延时加载实现了!