Fragment实现懒加载

主要是Fragment实现懒加载,直接继承此类即可,


import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public abstract class LazyFragment extends Fragment {

    FragmentDelegater mFragmentDelegater;

    private View rootView = null;
    private boolean isViewCreated = false;
    private boolean isCurrentVisibleState = false;
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        E("onCreateView: ");

        if (rootView == null) {
            rootView = inflater.inflate(getLayoutRes(), container, false);
        }
        initView(rootView);
        isViewCreated = true;
        // 本次分发主要时用于分发默认tab可见状态,这种状况下它的生命周期是:1 fragment setUserVisibleHint: true-》onAttach-》onCreate-》onCreateView-》onResume
        // 默认 Tab getUserVisibleHint() = true !isHidden() = true
        // 对于非默认 tab 或者非默认显示的 Fragment 在该生命周期中只做了 isViewCreated 标志位设置 可见状态将不会在这里分发
        if (getUserVisibleHint()) {
            setUserVisibleHint(true);
        }
        return  rootView;
    }

    protected abstract void initView(View rootView);

    protected abstract int getLayoutRes();


    //修改fragment的可见性
    //setUserVisibleHint 被调用有两种情况:
    // 1) 在切换tab的时候,会先于所有fragment的其他生命周期,先调用这个函数,可以看log,
    //     对于默认 tab 和 间隔 checked tab 需要等到 isViewCreated = true 后才可以通过此通知用户可见
    //2)对于之前已经调用过setUserVisibleHint 方法的fragment后,让fragment从可见到不可见之间状态的变化
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        E("setUserVisibleHint: " + isVisibleToUser);
        if (isViewCreated) {
            if(isVisibleToUser && !isCurrentVisibleState) {
                dispatchUserVisibleHint(true);
            } else if (isCurrentVisibleState && !isVisibleToUser){
                dispatchUserVisibleHint(false);
            }
        }


    }

    //如果可见:加载网络,否则不加载网络
    private void dispatchUserVisibleHint(boolean visibleState) {
        if (isCurrentVisibleState == visibleState) {
            return;
        }
        isCurrentVisibleState = visibleState;
        if (visibleState) {
            onFragmentLoad();
        } else {
            onFragmentLoadStop();
        }
    }

    //停止加载网络
    public void onFragmentLoadStop() {
    }

    // 触发加载网络
    public void onFragmentLoad() {
    }


    @Override
    public void onResume() {
        super.onResume();
        if (getUserVisibleHint()) {
            dispatchUserVisibleHint(true);
        }


    }
    @Override
    public void onPause() {
        super.onPause();
        E("onPause");
        if (getUserVisibleHint()) {
            dispatchUserVisibleHint(false);
        }


    }
    @Override
    public void onDestroyView() {
        super.onDestroyView();
        E("onDestroyView");
        isViewCreated = false;
    }




    public void setFragmentDelegater(FragmentDelegater fragmentDelegater) {
        mFragmentDelegater = fragmentDelegater;
    }

    private void E(String  string) {
        if (mFragmentDelegater != null) {
            mFragmentDelegater.dumpLifeCycle(string);
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值