viewpager+fragment的懒加载

viewpager+fragment的使用一般会有预加载的问题,这就导致数据会请求很多次,用户体验不好,所以一般都会采用懒加载;当前页面可见时,请求网络,并且左右滑动的页面网络只请求一次。 下面是对懒加载进行封装的代码:
base类

public abstract class BaseLazyFragment extends Fragment { private LoadingDialog loadingDialog; protected View rootView; private int count; //记录开启进度条的情况 只能开一个 //当前Fragment是否处于可见状态标志,防止因ViewPager的缓存机制而导致回调函数的触发 private boolean isFragmentVisible; //是否是第一次开启网络加载 public boolean isFirst; private Unbinder mUnbinder; public String token; @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if (rootView == null) rootView = inflater.inflate(getLayoutResource(), container, false); mUnbinder = ButterKnife.bind(this, rootView); loadingDialog = new LoadingDialog(getActivity()); token = SaveSharedPreferences.getString(getActivity(), Common.TOKEN); initView(); //可见,但是并没有加载过 if (isFragmentVisible && !isFirst) { onFragmentVisibleChange(true); } return rootView; }//获取布局文件 protected abstract int getLayoutResource(); //初始化view protected abstract void initView(); @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser) { isFragmentVisible = true; } if (rootView == null) { return; } //可见,并且没有加载过 if (!isFirst && isFragmentVisible) { onFragmentVisibleChange(true); return; } //由可见——>不可见 已经加载过 if (isFragmentVisible) { onFragmentVisibleChange(false); isFragmentVisible = false; } }/** * 当前fragment可见状态发生变化时会回调该方法 * 如果当前fragment是第一次加载,等待onCreateView后才会回调该方法,其它情况回调时机跟 {@link #setUserVisibleHint(boolean)}一致 * 在该回调方法中你可以做一些加载数据操作,甚至是控件的操作. * * @param isVisible true不可见 -> 可见 *false 可见-> 不可见 */ protected void onFragmentVisibleChange(boolean isVisible) {}public void showLoading(){ loadingDialog.show(); }public void dismissLoading(){ loadingDialog.dismiss(); }@Override public void onDestroy() { super.onDestroy(); mUnbinder.unbind(); } }

【viewpager+fragment的懒加载】fragment的代码:继承BaseLazyFragment
@Override protected int getLayoutResource() { return R.layout.fragment_essay; }@Override protected void initView() {}@Override protected void onFragmentVisibleChange(boolean isVisible) { if (isVisible) { initData(); } } //这个方法做逻辑的操作 public void initData() {if (!isFirst) { isFirst=true; initSortData(); //这个方法是请求网络的操作,第一次进来请求网络,并把变量置为true,再次进来的时候就不会走该方法了 } }

    推荐阅读