最近使用viewpager 搭配fragment实现懒加载的功能,使用到了setUserVisibleHint的方法,该方法执行在fragment的onCreateView方法之前,该方法不止调用一次,我们通过getUserVisibleHint()判断fragment是否可见,可见时则调用load方法加载数据,其中isPrepared为onCreateView是否调用完毕,isFirst为是否第一次可见。
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
Log.d("tag", "可见");
if (getUserVisibleHint()) {
Log.d("tag", "加载");
isVisible = true;
LazyLoad();
}
}
private void LazyLoad() {
if (isVisible && isPrepared && isFirst) {
isFirst = false;
initData();
}
}
这样写是正确的。但是在调试时发现,如果viewpager有三个页面时,我们按顺序从第一个滑到第三个fragment时,可实现懒加载,但如果从第一个fragment直接跳转到第三个fragment会发现数据加载不出来。
原因是viewpager默认预加载一个页面,所以我们从第一个界面滑倒第二个fragment界面时,第三个fragment已经创建,即onCreateView被执行,isPrapared=true,此时顺利执行lazyLoad方法。但直接从第一个fragment跳转至第三个fragment时,由于 setUserVisibleHint()优先与onCreateView执行,从而导致isPrepared没有变为true时就执行到了lazyload()的方法,因此无法加载数据。
解决方法也很粗暴,在少数界面比如三个时,我们直接设置viewpage的预加载页面数为2即可
viewpager.setOffscreenPageLimit(2);