ViewPager+Fragment实现懒加载(lazy-loading)

来源:互联网 发布:有什么软件可以赚钱 编辑:程序博客网 时间:2024/06/13 22:31
源码在GitHub上

什么是lazy-loading呢?顾名思义就是在必要的时候才加载,否则不进行View的绘制和数据的加载。原因是Viewpager一次只会显示一个页卡,那么刚开始的时候,只需加载第一张Fragment页卡,其他的不加载,当用户向右滑动切换再进行加载。因为其他Fragment对于用户来说是不可见的,如果一开始就把全部Fragment一起加载,可能造成启动时卡顿的问题,更重要的是可能白白耗费用户的流量,因为用户可能并不需要其他Fragment的信息。

1、首先创建一个BaseFragment
①、setUserVisibleHint查询当前fragment是否显示,用isVisible来标识
②、在onCreateView中Fragment是否创建,用isPrepared来标识
③、whetherLazzyLoad()方法中判断是否加载lazyLoad()方法,当isVisible和isPrepared都为true的时候才加载
④、 whetherLazzyLoad在onVisible()和onCreateView()方法中都需要调用第一次创建Fragment(onCreateView)的时候需要调用whetherLazzLoad,每次切换(onVisible)再次调用whetherLazzLoad

/**
 * ViewPager adapter中的每个fragment切换的时候都会被调用,如果是切换到当前页,那么isVisibleToUser==true,否则为false
 */
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
        isVisible true;
        onVisible();
   else {
        isVisible false;
        onInvisible();
    }
}

/**
 * 可见
 */
protected void onVisible() {
    whetherLazyLoad();
}


/**
 * 不可见
 */
protected void onInvisible() {
    stopLoad();//停止耗时的操作
}

/**
 * 延迟加载
 * 子类必须重写此方法
 */
protected void whetherLazyLoad() {
    if (!isVisible || !isPrepared) {
        return;
    }
    lazyLoad();
}

onCreateView中将isPrepared设置为true,并调用whetherLazyLoad()方法
@Nullable
@Override
public View onCreateView(LayoutInflater inflater@Nullable ViewGroup container@Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(getLayoutId()container, false);
    mBind = ButterKnife.bind(this, view);
    if (this instanceof BaseView) {
        mPresenter = InstanceUtil.getInstance(this, 0);
        mPresenter.setVM(this, InstanceUtil.getInstance(this, 1));
    }
    isPrepared true;
    whetherLazyLoad();
    initView(viewsavedInstanceState);
    return view;
}

抽象方法,子类实现:
/**
 * 懒加载,联网等操作
 */
protected abstract void lazyLoad();

/**
 * 停止耗时的操作,计时器,动画等
 */
protected abstract void stopLoad();