什么是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();
}
}
* 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 onVisible() {
whetherLazyLoad();
}
/**
* 不可见
*/
protected void onInvisible() {
stopLoad();//停止耗时的操作
}
* 不可见
*/
protected void onInvisible() {
stopLoad();//停止耗时的操作
}
/**
* 延迟加载
* 子类必须重写此方法
*/
protected void whetherLazyLoad() {
if (!isVisible || !isPrepared) {
return;
}
lazyLoad();
}
* 延迟加载
* 子类必须重写此方法
*/
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(view, savedInstanceState);
return view;
}
@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(view, savedInstanceState);
return view;
}
抽象方法,子类实现:
/**
* 懒加载,联网等操作
*/
protected abstract void lazyLoad();
/**
* 停止耗时的操作,计时器,动画等
*/
protected abstract void stopLoad();
* 懒加载,联网等操作
*/
protected abstract void lazyLoad();
/**
* 停止耗时的操作,计时器,动画等
*/
protected abstract void stopLoad();