package com.team.zhuoke.base; import android.content.Context; import android.os.Bundle; import android.support.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.team.zhuoke.model.ContractProxy; import com.trello.rxlifecycle.components.support.RxFragment; import butterknife.ButterKnife; import butterknife.Unbinder; /** * 作者:gaoyin * 电话:18810474975 * 邮箱:18810474975@163.com * 版本号:1.0 * 类描述: * 备注消息: * 修改时间:2016/11/14 上午11:28 **/ public abstract class BaseFragment<M extends BaseModel,P extends BasePresenter> extends RxFragment { protected Unbinder unbinder; protected View rootView; protected Context mContext = null;//context private boolean isViewPrepared; // 标识fragment视图已经初始化完毕 private boolean hasFetchData; // 标识已经触发过懒加载数据 // 定义Presenter protected P mPresenter; // 获取布局资源文件 protected abstract int getLayoutId(); // 初始化数据 protected abstract void onInitView(Bundle bundle); // 初始化事件Event protected abstract void onEvent(); // 获取抽取View对象 protected abstract BaseView getViewImp(); // 获得抽取接口Model对象 protected Class getModelClazz() { return (Class<M>)ContractProxy.getModelClazz(getClass(), 0); } // 获得抽取接口Presenter对象 protected Class getPresenterClazz() { return (Class<P>)ContractProxy.getPresnterClazz(getClass(), 1); } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { if (rootView != null) { ViewGroup parent = (ViewGroup) rootView.getParent(); if (parent != null) { parent.removeView(rootView); } return rootView; } if (getLayoutId() != 0) { rootView = inflater.inflate(getLayoutId(),container, false); } else { rootView = super.onCreateView(inflater, container, savedInstanceState); } unbinder= ButterKnife.bind(this, rootView); bindMVP(); onInitView(savedInstanceState); return rootView; } @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser) { lazyFetchDataIfPrepared(); } } /** * 获取presenter 实例 */ private void bindMVP() { if(getPresenterClazz()!=null) { mPresenter=getPresenterImpl(); mPresenter.mContext=getActivity(); bindVM(); } } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); onEvent(); } private <T> T getPresenterImpl() { return ContractProxy.getInstance().presenter(getPresenterClazz()); } @Override public void onStart() { if(mPresenter==null) { bindMVP(); } super.onStart(); } private void bindVM() { if(mPresenter!=null&&!mPresenter.isViewBind()&&getModelClazz()!=null&&getViewImp()!=null) { ContractProxy.getInstance().bindModel(getModelClazz(),mPresenter); ContractProxy.getInstance().bindView(getViewImp(),mPresenter); mPresenter.mContext=getActivity(); } } @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); mContext=getActivity(); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); isViewPrepared = true; lazyFetchDataIfPrepared(); if(mPresenter==null) { bindMVP(); } } /** * 进行懒加载 */ private void lazyFetchDataIfPrepared() { // 用户可见fragment && 没有加载过数据 && 视图已经准备完毕 if (getUserVisibleHint() && !hasFetchData && isViewPrepared) { hasFetchData = true; lazyFetchData(); } } /** * 懒加载的方式获取数据,仅在满足fragment可见和视图已经准备好的时候调用一次 */ protected abstract void lazyFetchData() ; @Override public void onDestroy() { super.onDestroy(); if (unbinder != null) { unbinder.unbind(); } if(mPresenter!=null) { ContractProxy.getInstance().unbindView(getViewImp(),mPresenter); ContractProxy.getInstance().unbindModel(getModelClazz(),mPresenter); } } }