package com.anthony.library.base; import android.os.Bundle; import android.support.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; /** * Created by Anthony on 2016/11/2. * Class Note: * implements this class to implements Lazy loading for fragment * <p> * must load data in method {@link #loadLazyData()} */ public abstract class BaseLazyFragment extends AbsBaseFragment { private boolean isPrepared;//flag whether view is okay private boolean isFirstLoad = true;//flag whether firstly load private boolean isVisible;//flag whether view is visible @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = super.onCreateView(inflater, container, savedInstanceState); isFirstLoad = true; return view; } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { isPrepared = true; lazyLoad(); //load data before initViews and ButterKnife bind super.onViewCreated(view, savedInstanceState); } /** * when used with {@link android.support.v4.view.ViewPager} invoke this method * * @param isVisibleToUser */ @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (getUserVisibleHint()) { isVisible = true; onVisible(); } else { isVisible = false; onInvisible(); } } /** * 1 used when using {@link android.support.v4.app.FragmentTransaction}to show or hide fragment * 2 to invoke this event ,when initialize fragment call show after hide * 3 Called when the hidden state (as returned by {@link #isHidden()} of * the fragment has changed. Fragments start out not hidden; this will * be called whenever the fragment changes state from that. * * @param hidden True if the fragment is now hidden, false if it is not * visible. */ @Override public void onHiddenChanged(boolean hidden) { super.onHiddenChanged(hidden); if (!hidden) { isVisible = true; onVisible(); } else { isVisible = false; onInvisible(); } } protected void onVisible() { lazyLoad(); } protected void onInvisible() { } /** * to implements lazy laodd , need to set isPrepared to true in {@link #onViewCreated(View, Bundle)} * isPrepared = true; */ protected void lazyLoad() { if (!isPrepared || !isVisible || !isFirstLoad) { return; } isFirstLoad = false; loadLazyData(); } protected abstract void loadLazyData(); @Override protected void loadData() { //use loadLazyData() instead } }