BaseFragment.java 6.1 KB
package com.yinhebairong.clasmanage.base;

import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
//import android.support.v4.app.Fragment;
//import android.support.v7.widget.GridLayoutManager;
//import android.support.v7.widget.LinearLayoutManager;
//import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.yinhebairong.clasmanage.base.instant.Layout;
import com.yinhebairong.clasmanage.network.ApiService;
import com.yinhebairong.clasmanage.network.ApiStore;

import butterknife.ButterKnife;
import butterknife.Unbinder;

public abstract class BaseFragment extends Fragment {

    private Toast toast;

    int layoutResId;

    Unbinder unbinder;

    //   ------------------------------------------   优化  ----------------------------------------
    private String TAG = BaseFragment.class.getSimpleName();
    /**
     * 是否执行了lazyLoad方法
     */
    private boolean isLoaded;
    /**
     * 是否创建了View
     */
    private boolean isCreateView;
    private View mRoot;

    /**
     * 当从另一个activity回到fragment所在的activity
     * 当fragment回调onResume方法的时候,可以通过这个变量判断fragment是否可见,来决定是否要刷新数据
     */
    public boolean isVisible;

    /*
     * 此方法在viewpager嵌套fragment时会回调
     * 查看FragmentPagerAdapter源码中instantiateItem和setPrimaryItem会调用此方法
     * 在所有生命周期方法前调用
     * 这个基类适用于在viewpager嵌套少量的fragment页面
     * 该方法是第一个回调,可以将数据放在这里处理(viewpager默认会预加载一个页面)
     * 只在fragment可见时加载数据,加快响应速度
     * */
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (getUserVisibleHint()) {
            onVisible();
        } else {
            onInvisible();
        }
    }


    /*
     *  因为Fragment是缓存在内存中,所以可以保存mRoot ,防止view的重复加载
     *  与FragmentPagerAdapter 中destroyItem方法取消调用父类的效果是一样的,可以任选一种做法
     *  推荐第二种
     * */
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        try {
            Layout layout = getClass().getAnnotation(Layout.class);
            if (layout == null) {
                layoutResId = layout.value();
            } else {
                if (layout.value() != -1) {
                    layoutResId = layout.value();
                } else {
                    throw new Exception("请在您的Fragment的Class上注解:@Layout(你的layout资源id)");
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (mRoot == null) {
            mRoot = LayoutInflater.from(getActivity()).inflate(layoutResId, container, false);
            isCreateView = true;
            unbinder = ButterKnife.bind(this, mRoot);
            initView(mRoot);
            initListener();
            onVisible();
        }

        return mRoot;
    }

    //   -------------------------------------------------   优化   ----------------------------------------------------------------
    protected void onInvisible() {
        isVisible = false;
    }

    protected void onVisible() {

        isVisible = true;
        if (isLoaded) {
            refreshLoad();
        }
        if (!isLoaded && isCreateView && getUserVisibleHint()) {
            isLoaded = true;
            lazyLoad();
        }
    }

    protected abstract void initView(View root);

    protected abstract void initListener();

    /**
     * fragment第一次可见的时候回调此方法
     */
    protected abstract void lazyLoad();

    /**
     * 在Fragment第一次可见加载以后,每次Fragment滑动可见的时候会回调这个方法,
     * 子类可以重写这个方法做数据刷新操作
     */
    protected void refreshLoad() {
    }

    //   ----------------------------------------------------   简用   -------------------------------------------------------------

    /**
     * @param manager     //   - > manager 0 = GridLayoutManager | 1 = LinearLayoutManager
     * @param rv
     * @param orientation //   - > orientation 0 = VERTICAL | else HORIZONTAL
     * @param count       //   - > count  设置 GridLayoutManager 的横向数量
     */
    @SuppressLint("WrongConstant")
    public void setRv(RecyclerView rv, int manager, int orientation, int count) {
        if (manager == 0) {
            GridLayoutManager gridManager = new GridLayoutManager(getActivity(), count);
            rv.setLayoutManager(gridManager);
        } else {
            LinearLayoutManager linearManager = new LinearLayoutManager(getActivity());
            if (orientation == 0) {
                linearManager.setOrientation(LinearLayoutManager.VERTICAL);
            } else {
                linearManager.setOrientation(LinearLayoutManager.HORIZONTAL);
            }
            rv.setLayoutManager(linearManager);
        }
    }

    // --------------------------   api   -------------------------------------------
    public ApiService Api() {
        ApiService api = ApiStore.createApi(ApiService.class);
        return api;
    }

    protected void showToast(String message) {
        if (getActivity() == null) return;
        if (toast == null) toast = Toast.makeText(getActivity(), message, Toast.LENGTH_SHORT);
        else toast.setText(message);
        toast.show();
    }

    public void startActivitys(Class<?> cls) {
        super.startActivity(new Intent(getActivity(), cls));
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if(null!=unbinder){
            unbinder.unbind();
        }
    }

}