版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_39397471/article/details/77325556
ViewPager + Fragment实现懒加载
标签(空格分隔): Android课程
http://blog.csdn.net/tellh/article/details/50705178
http://www.jianshu.com/p/c5d29a0c3f4c
推荐框架
https://github.com/lianghanzhen/LazyViewPager
介绍
懒加载,指的是必要的时候才加载,否则不进行View的绘制和数据的加载。原因是Viewpager一次只会显示一个页面,那么初始进来时,只需加载第一张Fragment页卡,其他的不加载,当用户向右滑动切换再进行加载。
因为其他Fragment对于用户来说是不可见的,如果一开始就把全部Fragment一起加载,可能造成启动时卡顿的问题,更重要的是可能白白耗费用户的流量,因为用户可能并不需要其他Fragment的信息。
Fragment使用介绍
- viewPager.setOffscreenPageLimit()方法设置ViewPager允许有多少张pages存在于屏幕外(不包括正在显示的page),默认值是1。在范围之外的pages 的View会被销毁,即onDestroyView()会被执行。
- 刚被new出来的Fragment并没有开始它的生命周期,当它被添加到FragmentManager时生命周期才开始。
- setUserVisibleHint(),该方法在Fragment被用户可见时会调用且传入true值,不可见时则得到false值
- 延迟加载实现:当前界面(Fragment)可见,并且Fragment已经初始化完毕、网络数据未加载,则请求数据
代码实现
public abstract class BasePageFragment extends Fragment {
//是否可见
protected boolean isVisible;
//View是否初始化
protected boolean isViewInit;
//数据是否初始化
protected boolean isDataInit;
/**
* 在Activity完成其onCreate()回调之后调用
* @param savedInstanceState
*/
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
isViewInit = true;
prepareFetchData();
}
/**
* 当fragment被用户可见时,setUserVisibleHint()会调用且传入true值,
* 当fragment不被用户可见时,setUserVisibleHint()则得到false值
* @param isVisibleToUser
*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
this.isVisible = isVisibleToUser;
prepareFetchData();
}
public boolean prepareFetchData() {
//当前界面(Fragment)可见,并且Fragment已经初始化完毕、网络数据未加载,则请求数据
if (isVisible && isViewInit && !isDataInit) {
fetchData();
isDataInit = true;
return true;
}
return false;
}
public abstract void fetchData();
}