最近使用viewpager 搭配fragment實現(xiàn)懶加載的功能希停,使用到了setUserVisibleHint的方法烁巫,該方法執(zhí)行在fragment的onCreateView方法之前,該方法不止調(diào)用一次宠能,我們通過getUserVisibleHint()判斷fragment是否可見亚隙,可見時則調(diào)用load方法加載數(shù)據(jù),其中isPrepared為onCreateView是否調(diào)用完畢违崇,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();
}
}
這樣寫是正確的。但是在調(diào)試時發(fā)現(xiàn)羞延,如果viewpager有三個頁面時渣淳,我們按順序從第一個滑到第三個fragment時,可實現(xiàn)懶加載伴箩,但如果從第一個fragment直接跳轉(zhuǎn)到第三個fragment會發(fā)現(xiàn)數(shù)據(jù)加載不出來入愧。
原因是viewpager默認預(yù)加載一個頁面,所以我們從第一個界面滑倒第二個fragment界面時,第三個fragment已經(jīng)創(chuàng)建砂客,即onCreateView被執(zhí)行泥张,isPrapared=true,此時順利執(zhí)行l(wèi)azyLoad方法。但直接從第一個fragment跳轉(zhuǎn)至第三個fragment時鞠值,由于 setUserVisibleHint()優(yōu)先與onCreateView執(zhí)行媚创,從而導(dǎo)致isPrepared沒有變?yōu)閠rue時就執(zhí)行到了lazyload()的方法,因此無法加載數(shù)據(jù)彤恶。
解決方法也很粗暴钞钙,在少數(shù)界面比如三個時,我們直接設(shè)置viewpage的預(yù)加載頁面數(shù)為2即可
viewpager.setOffscreenPageLimit(2);