当我们的Viewpager含有很多个fragment时 一次全加载出来太占内存 我们可以用fragment的懒加载 当fragment可见的时候加载数据
Viewpager加载fragment的时候有个特点 会预加载当前可见页面左右相邻的页面 相邻的页面会走一遍生命周期(从onAttach直到onResume)
1 /* 2 * Date: 14-7-17 3 * Project: Access-Control-V2 4 */ 5 package cn.irains.access_control_v2.common; 6 7 import android.support.v4.app.Fragment; 8 9 /** 10 * Author: msdx (645079761@qq.com) 11 * Time: 14-7-17 下午5:46 12 */ 13 public abstract class LazyFragment extends Fragment { 14 protected boolean isVisible; 15 /** 16 * 在这里实现Fragment数据的缓加载. 17 * @param isVisibleToUser 18 */ 19 @Override 20 public void setUserVisibleHint(boolean isVisibleToUser) { 21 super.setUserVisibleHint(isVisibleToUser); 22 if(getUserVisibleHint()) { 23 isVisible = true; 24 onVisible(); 25 } else { 26 isVisible = false; 27 onInvisible(); 28 } 29 } 30 31 protected void onVisible(){ 32 lazyLoad(); 33 } 34 35 protected abstract void lazyLoad(); 36 37 protected void onInvisible(){} 38 }
setUserVisibleHint(boolean isVisibleToUser)在onCreateView之前执行
然后去定义一个类继承上边的父类
public class OpenResultFragment extends LazyFragment{ // 标志位,标志已经初始化完成。 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; } //填充各控件的数据 } }
这样就保证了 只有在fragment可见时才去加载数据 不会造成activity一次加载很多fragment的数据