vp.setOffscreenPageLimit(0);
public void setOffscreenPageLimit(int limit) { if (limit < 1) { Log.w("ViewPager", "Requested offscreen page limit " + limit + " too small; defaulting to " + 1); limit = 1; } if (limit != this.mOffscreenPageLimit) { this.mOffscreenPageLimit = limit; this.populate(); } }
/** * <pre> * @author yangchong * blog : https://github.com/yangchong211 * time : 2017/7/22 * desc : 懒加载 * revise: 懒加载时机:onCreateView()方法执行完毕 + setUserVisibleHint()方法返回true * </pre> */ public abstract class BaseLazyFragment extends BaseFragment { /* * 预加载页面回调的生命周期流程: * setUserVisibleHint() -->onAttach() --> onCreate()-->onCreateView()--> * onActivityCreate() --> onStart() --> onResume() */ /** * 懒加载过 */ protected boolean isLazyLoaded = false; /** * Fragment的View加载完毕的标记 */ private boolean isPrepared = false; /** * 第一步,改变isPrepared标记 * 当onViewCreated()方法执行时,代表View已经加载完毕,此时改变isPrepared标记为true,并调用lazyLoad()方法 */ @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); isPrepared = true; //只有Fragment onCreateView好了 //另外这里调用一次lazyLoad() lazyLoad(); } /** * 第二步 * 此方法会在onCreateView()以前执行 * 当viewPager中fragment改变可见状态时也会调用 * 当fragment 从可见到不见,或者从不可见切换到可见,都会调用此方法 * true表示当前页面可见,false表示不可见 */ @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); LogUtil.d("setUserVisibleHint---"+isVisibleToUser); //只有当fragment可见时,才进行加载数据 if (isVisibleToUser){ lazyLoad(); } } /** * 调用懒加载 * 第三步:在lazyLoad()方法中进行双重标记判断,经过后便可进行数据加载 */ private void lazyLoad() { if (getUserVisibleHint() && isPrepared && !isLazyLoaded) { showFirstLoading(); onLazyLoad(); isLazyLoaded = true; } else { //当视图已经对用户不可见而且加载过数据,若是须要在切换到其余页面时中止加载数据,能够覆写此方法 if (isLazyLoaded) { stopLoad(); } } } /** * 视图销毁的时候讲Fragment是否初始化的状态变为false */ @Override public void onDestroyView() { super.onDestroyView(); isLazyLoaded = false; isPrepared = false; } /** * 第一次可见时,操做该方法,能够用于showLoading操做,注意这个是全局加载loading */ protected void showFirstLoading() { LogUtil.i("第一次可见时show全局loading"); } /** * 中止加载 * 当视图已经对用户不可见而且加载过数据,可是没有加载完,而只是加载loading。 * 若是须要在切换到其余页面时中止加载数据,能够覆写此方法。 * 存在问题,如何中止加载网络 */ protected void stopLoad(){ } /** * 第四步:定义抽象方法onLazyLoad(),具体加载数据的工做,交给子类去完成 */ @UiThread protected abstract void onLazyLoad(); }
/** * <pre> * @author yangchong * blog : https://github.com/yangchong211 * time : 2017/7/20 * desc : fragment的父类 * revise: 注意,该类具备懒加载 * </pre> */ public abstract class BaseStateFragment extends BaseLazyFragment { protected StateLayoutManager statusLayoutManager; private View view; @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { if(view==null){ view = inflater.inflate(R.layout.base_state_view, container , false); initStatusLayout(); initBaseView(view); } return view; } @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); initView(view); initListener(); } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); } /** * 获取到子布局 * @param view view */ private void initBaseView(View view) { LinearLayout llStateView = view.findViewById(R.id.ll_state_view); llStateView.addView(statusLayoutManager.getRootLayout()); } /** * 初始化状态管理器相关操做 */ protected abstract void initStatusLayout(); /** * 初始化View的代码写在这个方法中 * @param view view */ public abstract void initView(View view); /** * 初始化监听器的代码写在这个方法中 */ public abstract void initListener(); /** * 第一次可见状态时,showLoading操做,注意下拉刷新操做时不要用该全局loading */ @Override protected void showFirstLoading() { super.showFirstLoading(); showLoading(); } /*protected void initStatusLayout() { statusLayoutManager = StateLayoutManager.newBuilder(activity) .contentView(R.layout.common_fragment_list) .emptyDataView(R.layout.view_custom_empty_data) .errorView(R.layout.view_custom_data_error) .loadingView(R.layout.view_custom_loading_data) .netWorkErrorView(R.layout.view_custom_network_error) .build(); }*/ /*---------------------------------下面是状态切换方法-----------------------------------------*/ /** * 加载成功 */ protected void showContent() { if (statusLayoutManager!=null){ statusLayoutManager.showContent(); } } /** * 加载无数据 */ protected void showEmptyData() { if (statusLayoutManager!=null){ statusLayoutManager.showEmptyData(); } } /** * 加载异常 */ protected void showError() { if (statusLayoutManager!=null){ statusLayoutManager.showError(); } } /** * 加载网络异常 */ protected void showNetWorkError() { if (statusLayoutManager!=null){ statusLayoutManager.showNetWorkError(); } } /** * 加载loading */ protected void showLoading() { if (statusLayoutManager!=null){ statusLayoutManager.showLoading(); } } } //如何切换状态呢? showContent(); showEmptyData(); showError(); showLoading(); showNetWorkError(); //或者这样操做也能够 statusLayoutManager.showLoading(); statusLayoutManager.showContent();