Android應用開發中,經常會用到ViewPager + Fragment,雖然效果不錯,但隨之而來的還有一些問題,下面就說說其中的初始化問題。
ViewPager初始化時會預加載前后的2個頁面,即使設置了setOffscreenPageLimit(0); 它至少也會預加載一個頁面
但在實際場景中,可能我們不需要這個預加載的功能,這時我們就需要對其進行一些控制。
我使用的方法是setUserVisibleHint(boolean isVisibleToUser)
每次ViewPager預加載頁面的時候,被預加載的Fragment都會調用這個方法,所以我就通過這個方法來控制Fragment里面的數據初始化
使用前提是Fragment頁面的數量不是很多,設置setOffscreenPageLimit(所有Fragment的數量);
原因是如果不全部預加載,那么當滑動頁面超出預加載范圍之后,就會有頁面被銷毀,那么這個控制方法就失效了,當然,如果沒有特殊的需求
不設置這個方法也不會有問題,主要看自己的需求。
具體方法如下:
public boolean canExcute = true;//為了onActivityCreated中setUserVisibleHint方法只執行一次
public boolean isFirstExcute = true;//標記頁面是否是第一次加載,為了初始化只執行一次
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (canExcute) {//頁面第一次加載時執行,以后不在執行
canExcute = false;
setUserVisibleHint(getUserVisibleHint());
}
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (canExcute) {//onActivityCreated方法執行之前,不讓此方法執行
return;
}
if (isVisibleToUser && isFirstExcute) {// 頁面可見並且是第一次加載
isFirstExcute= false;//標記頁面已經加載過一次,以后不需要在執行
initData();//把你只需要初始化一次的數據寫在這個方法里面
}
if (getUserVisibleHint()) {// 頁面每次對用戶可見時執行
} else {
}
}
以上方法不一定對所有場景都適用,大家使用時還是需要經過測試並改進。