package tellh.com.gitclub.common.base; import android.app.ProgressDialog; import android.content.Context; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import rx.Subscription; import rx.subscriptions.CompositeSubscription; import tellh.com.gitclub.R; import tellh.com.gitclub.common.utils.Utils; import tellh.com.gitclub.common.wrapper.Note; public abstract class LazyFragment extends Fragment implements BaseView { protected boolean hasInit = false; protected ProgressDialog progressDialog; protected View mRootView; private Bundle mSavedInstanceState; private CompositeSubscription subscriptions; @Override public Context getViewContext() { return getContext(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if (subscriptions == null) subscriptions = new CompositeSubscription(); if (mRootView == null) { mRootView = inflater.inflate(getLayoutId(), container, false); this.mSavedInstanceState = savedInstanceState; initView(); progressDialog = new ProgressDialog(getContext()); progressDialog.setCanceledOnTouchOutside(false); } if (!shouldLazyLoad()) loadData(getUserVisibleHint(), true); return mRootView; } @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); loadData(isVisibleToUser, false); } private void loadData(boolean isVisibleToUser, boolean forceToLoad) { if (forceToLoad || (isVisibleToUser && !hasInit && shouldLazyLoad())) { Runnable runnable = new Runnable() { public void run() { initData(mSavedInstanceState); hasInit = true; } }; new Handler().postDelayed(runnable, 500); } } protected boolean shouldLazyLoad() { return true; } @Override public void showOnError(String s) { progressDialog.dismiss(); Note.show(s); } @Override public void showOnLoading() { progressDialog.setMessage("Loading..."); progressDialog.show(); } @Override public void showOnSuccess() { progressDialog.dismiss(); Note.show(getString(R.string.success_loading)); } @Override public void onDestroy() { super.onDestroy(); subscriptions.unsubscribe(); subscriptions = null; Utils.leakWatch(this); } public void addSubscription(Subscription subscription) { subscriptions.add(subscription); } }