Fragment懒加载

2021-01-16  本文已影响0人  duoduo7628

使用方式:
继承AbsLazyFragment ,在public abstract boolean onLazyInit()加载数据即可。
viewpager + fragment 或者 activity + fragment(show+hide)都可以使用。
废话不多说直接上代码

public abstract class AbsLazyFragment extends BaseFragment{

    /**
     * 是否执行懒加载
     */
    private boolean isLoaded = false;

    /**
     * 当前Fragment是否对用户可见
     */
    private boolean isVisibleToUser = false;

    /**
     * 当使用ViewPager+Fragment形式会调用该方法时,setUserVisibleHint会优先Fragment生命周期函数调用,
     * 所以这个时候就,会导致在setUserVisibleHint方法执行时就执行了懒加载,
     * 而不是在onResume方法实际调用的时候执行懒加载。所以需要这个变量
     */
    private boolean isCallResume = false;

    /**
     * 是否调用了setUserVisibleHint方法。处理show+add+hide模式下,默认可见 Fragment 不调用
     * onHiddenChanged 方法,进而不执行懒加载方法的问题。
     */
    private boolean isCallUserVisibleHint = false;


    @Override
    public void onResume() {
        super.onResume();

        isCallResume = true;
        if (!isCallUserVisibleHint){

            isVisibleToUser = !isHidden();
        }
        judgeLazyInit();
    }

    @Override
    public void onHiddenChanged(boolean hidden) {
        super.onHiddenChanged(hidden);
        isVisibleToUser = !hidden;
        judgeLazyInit();

    }

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        YxpLogUtils.e("sqw AbsLazyFragment setUserVisibleHint ---------->index = "+getFragmentIndex()+"   isVisibleToUser = "+isVisibleToUser);
        this.isVisibleToUser = isVisibleToUser;
        isCallUserVisibleHint = true;
        judgeLazyInit();
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        isLoaded = false;
        isVisibleToUser = false;
        isCallUserVisibleHint = false;
        isCallResume = false;
    }

    public void judgeLazyInit() {
        if (!isLoaded && isVisibleToUser && isCallResume) {
            isLoaded = onLazyInit();
        }
    }

    public void setLoaded(boolean loaded) {
        isLoaded = loaded;
    }

    /**
     * @return 返回值为是否已加载数据
     */
    public abstract boolean onLazyInit();

}

参考:
Androidx 下 Fragment 懒加载的新实现

上一篇 下一篇

猜你喜欢

热点阅读