在我们开发过程中,viewpager官方的加载机制是有预加载的,默认会把当时的这个fragment的左右两个都给预加载出来,即使调用 viewPager.setOffscreenPageLimit(0)这个方法,默认还是1,还是会有预加载的,所以我们就用懒加载的方式来禁止这种预加载,简答说就是当fragment初始化过后,而且它还是可见的,那么我们就让他去加载数据。
下面直接上代码
第一:在onCreateView方法中给初始化的Boolean值赋值,再写一个方法
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fr_simple_card, null);
//处理预加载问题,让fragment懒加载
isInit = true;
//初始化的时候去加载数据
isCanLoadData();
return view;
}
第二:重写setUserVisibleHint,判断是否可见的方法
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
isCanLoadData();
}
第三:写一个isCanLoadData()方法,里面判断视图是否已经初始化,而且视图还得可见,这时候才让页面去真正的加载数据,加载完将isLoad = true,当页面初始化了,但是页面不可见的时候,判断它是否已经加载过数据,如果加载过的话就让它停止加载。
/**
* 是否可以加载数据
* 可以加载数据的条件:
* 1.视图已经初始化
* 2.视图对用户可见
*/
private void isCanLoadData() {
//视图没有初始化
if (!isInit) {
return;
}
//判断视图对用户是否可见
if (getUserVisibleHint()) {
lazyLoad();
isLoad = true;
} else {
if (isLoad) {
stopLoad();
}
}
}
第四:自己写一个懒加载的方法和通知加载的方法
/**
* 当视图初始化并对用户可见的时候去真正的加载数据
*/
protected void lazyLoad() {
//里面开始对页面进行数据加载
}
/**
* 当视图已经对用户不可见并且加载过数据,如果需要在切换到其他页面时停止加载数据,可以覆写此方法
*/
protected void stopLoad() {
//让已经在加载过数据并不可见的页面停止加载(例如 视频播放时切换过去不可见时,要让它停止播放)
}
第五:在onDestroyView方法里面对两个Boolean值赋值设为false
@Override
public void onDestroyView() {
super.onDestroyView();
isInit = false;
isLoad = false;
}
然后你就会发现在滑动的时候只有当页面可见的时候才回去加载数据,懒加载就实现了。