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();