package com.laotan.easyreader.ui.fragment; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.chad.library.adapter.base.BaseQuickAdapter; import com.laotan.easyreader.http.LifeSubscription; import com.laotan.easyreader.http.Stateful; import com.laotan.easyreader.presenter.BasePresenter; import com.laotan.easyreader.view.LoadingPage; import javax.inject.Inject; import butterknife.ButterKnife; import butterknife.Unbinder; import rx.Subscription; import rx.subscriptions.CompositeSubscription; /** * Created by quantan.liu on 2017/3/22. */ public abstract class BaseFragment<P extends BasePresenter> extends Fragment implements LifeSubscription, Stateful { @Inject protected P mPresenter; @Inject protected BaseQuickAdapter mAdapter; public LoadingPage mLoadingPage; private boolean mIsVisible = false; // fragment是否显示了 private boolean isPrepared = false; private boolean isFirst = true; //只加载一次界面 protected View contentView; private Unbinder bind; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { if (mLoadingPage == null) { mLoadingPage = new LoadingPage(getContext()) { @Override protected void initView() { if (isFirst) { BaseFragment.this.contentView = this.contentView; bind = ButterKnife.bind(BaseFragment.this, contentView); BaseFragment.this.initView(); isFirst = false; } } @Override protected void loadData() { BaseFragment.this.loadData(); } @Override protected int getLayoutId() { return BaseFragment.this.getLayoutId(); } }; } isPrepared = true; loadBaseData(); return mLoadingPage; } /** * 在这里实现Fragment数据的缓加载. */ @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (getUserVisibleHint()) {//fragment可见 mIsVisible = true; onVisible(); } else {//fragment不可见 mIsVisible = false; onInvisible(); } } @Override public void setState(int state) { mLoadingPage.state = state; mLoadingPage.showPage(); } protected void onInvisible() { } /** * 显示时加载数据,需要这样的使用 * 注意声明 isPrepared,先初始化 * 生命周期会先执行 setUserVisibleHint 再执行onActivityCreated * 在 onActivityCreated 之后第一次显示加载数据,只加载一次 */ protected void onVisible() { if (isFirst) { initInject(); if (mPresenter!=null){ mPresenter.attachView(this);} } loadBaseData();//根据获取的数据来调用showView()切换界面 } public void loadBaseData() { if (!mIsVisible || !isPrepared || !isFirst) { return; } loadData(); } /** * 1 * 根据网络获取的数据返回状态,每一个子类的获取网络返回的都不一样,所以要交给子类去完成 */ protected abstract void loadData(); /** * 2 * 网络请求成功在去加载布局 * * @return */ protected abstract int getLayoutId(); /** * 3 * 子类关于View的操作(如setAdapter)都必须在这里面,会因为页面状态不为成功,而binding还没创建就引用而导致空指针。 * loadData()和initView只执行一次,如果有一些请求需要二次的不要放到loadData()里面。 */ protected abstract void initView(); /** * dagger2注入 */ protected abstract void initInject(); private CompositeSubscription mCompositeSubscription; //用于添加rx的监听的在onDestroy中记得关闭不然会内存泄漏。 @Override public void bindSubscription(Subscription subscription) { if (this.mCompositeSubscription == null) { this.mCompositeSubscription = new CompositeSubscription(); } this.mCompositeSubscription.add(subscription); } @Override public void onDetach() { super.onDetach(); if (bind != null) { bind.unbind(); } if (this.mCompositeSubscription != null && mCompositeSubscription.hasSubscriptions()) { this.mCompositeSubscription.unsubscribe(); } if (mPresenter!=null){ mPresenter.detachView(); } } }