一個Activity里面可能會以viewpager(或其他容器)與多個Fragment來組合使用诚些,而如果每個fragment都需要去加載數(shù)據(jù)葱峡,或從本地加載顿颅,或從網(wǎng)絡(luò)加載滩报,那么在這個activity剛創(chuàng)建的時候就變成需要初始化大量資源。這時候我們需要繼承并重寫fragment的懶加載方法setUserVisibleHint妇拯,通過判斷UI的可見性幻馁,設(shè)置當(dāng)切換到某個fragment的時候是否加載數(shù)據(jù)。
基類
public abstract class LazyFragment extends Fragment {
protected boolean isVisible;
/**
* 在這里實現(xiàn)Fragment數(shù)據(jù)的緩加載.
* @param isVisibleToUser
*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if(getUserVisibleHint()) {
isVisible = true;
onVisible();
} else {
isVisible = false;
onInvisible();
}
}
protected void onVisible(){
lazyLoad();
}
protected abstract void lazyLoad();
protected void onInvisible(){}
}
實現(xiàn)類
public class OpenResultFragment extends LazyFragment{
// 標志位越锈,標志已經(jīng)初始化完成宣赔。
private boolean isPrepared;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Log.d(LOG_TAG, "onCreateView");
View view = inflater.inflate(R.layout.fragment_open_result, container, false);
//XXX初始化view的各控件
isPrepared = true;
lazyLoad();
return view;
}
@Override
protected void lazyLoad() {
if(!isPrepared || !isVisible) {
return;
}
//填充各控件的數(shù)據(jù)
}
}