如何实现 ViewPager 懒加载

在日常开发当中, 我们经常会用到ViewPager, 通常呢, 我们会继承FragmentPagerAdapter或者FragmentStatePagerAdapter来作为适配器, 为了能实现ViewPager的懒加载, Cover到大多数情况, 所以我们先要了解一下这俩个Adapter的区别在哪里

FragmentPagerAdapter会只会销毁View, 并不会回收Fragment已经Fragment中的变量, 

而FragmentStatePagerAdapter在超过缓存位置后, 会彻底销毁View并回收Fragment


这里我先贴上代码

public abstract class BaseFragment extends Fragment {
    // 当前是否处于可见状态
    private boolean isVisible;
    // Fragment中的View是否已经初始化
    private boolean isViewInitialized;
    // 数据是否已经获取
    private boolean isDataInitialized;
    // 是否开启懒加载功能
    private boolean isLazyLoad;

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        isVisible = isVisibleToUser;
        if (isDataInitialized) {
            return;
        }
        if (isLazyLoad) {
            processLoadData();
        }
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        initView(view);
        isViewInitialized = true;
    }

    /**
     * 初始化View
     */
    protected abstract void initView(View view);

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        if (savedInstanceState != null) {
            restoreData(savedInstanceState);
            isDataInitialized = true;
        }
        if (isLazyLoad) {
            processLoadData();
        } else {
            if (savedInstanceState == null && !isDataInitialized) {
                fetchData();
                isDataInitialized = true;
            }
            setViewData();
        }
    }
    /**
     * 开启懒加载
     */
    protected void enableLazyLoad() {
        isLazyLoad = true;
    }
    /**
     * 恢复数据
     */
    protected abstract void restoreData(Bundle savedInstanceState);

    private void processLoadData() {
        if (isDataInitialized) {
            setViewData();
            return;
        }
        if (isVisible && isViewInitialized) {
            fetchData();
            isDataInitialized = true;
            setViewData();
        }
    }
    /**
     * 给控件设置数据
     */
    protected abstract void setViewData();
    /**
     * 获取数据
     */
    protected abstract void fetchData();

    @Override
    public void onViewStateRestored(@Nullable Bundle savedInstanceState) {
        super.onViewStateRestored(savedInstanceState);
    }
    
    @Override
    public void onDestroyView() {
        super.onDestroyView();
        isViewInitialized = false;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        isDataInitialized = false;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值