ViewPager和Fragment一起使用时,为了防止一进入Activity就加载所有Fragment的数据,减轻Activity初始化加载的负担,需要用懒加载的方式去加载Fragment,懒加载的方法如下:
让Fragment继承BaseFragment,BaseFragment代码如下所示:
/**
* 应用程序的基类Fragment,实现懒加载
* Created by Jack on 2016/5/17 08:31.
* Email: zhuochangjing@foxmail.com
*/
public abstract class BaseFragment extends Fragment {
protected boolean isVisible;
protected Dialog mDialog;
/**
* 在这里实现Fragment数据的懒加载
*
* @param isVisibleToUser Fragment UI对用户是否可见
*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (getUserVisibleHint()) {
isVisible = true;
onVisible();
} else {
isVisible = false;
onInvisible();
}
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle
savedInstanceState) {
View view = inflater.inflate(getContentView(), container, false);
initView(view);
mDialog = DialogUtil.createLoadingDialog(getActivity(), "正在加载数据中......");
return view;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
lazyLoad();
}
protected void onVisible() {
lazyLoad();
}
protected void onInvisible() {
}
protected abstract void lazyLoad();
protected abstract int getContentView();
protected abstract void initView(View view);
}
子Fragment代码如下:
public class LogisticsFragment extends BaseFragment{
private boolean isPrepared;
@Override
protected void lazyLoad() {
if (isPrepared && isVisible) {
//做加载数据的网络操作
isPrepared = false;
}
}
@Override
protected void initView(View view) {
//做初始化View的操作
isPrepared = true;
}
}
但是现在由于ViewPager和Fragment一起用,由于ViewPager默认只能缓存Fragment左右两边各一个Fragment,也就是说缓存值是1,设置缓存页面的方法如下:
mViewpager.setOffscreenPageLimit(2);
如果未调用上面的设置缓存页面的方法,默认缓存值就是1,此时如果你的Fragment页在3个及以上时,当你切换Fragment时,就会造成未缓存的Fragment会执行onDestroyView,然而再次切换到这个未缓存的Fragment或者切换到与这个未缓存的Fragment相邻的Fragment时,他就会再次执行onCreateView方法,也就是说再次initView,这样isPrepared又会被置为true,因此导致lazyLoad方法里的判断加载数据的表达式为true,加载数据就会再次执行了。
这里懒加载并不是说让lazyLoad方法只执行一次,而是通过判断让加载数据只执行一次。
ViewPager的设置缓存页面的方法具体细节可以翻阅官方文档:setOffscreenPageLimit