当我们的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 }
lazyfragment

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;  
        }  
        //填充各控件的数据  
    }  
  
}  
OpenResultFragment

 

这样就保证了 只有在fragment可见时才去加载数据  不会造成activity一次加载很多fragment的数据

posted on 2016-03-15 17:29  毕哥  阅读(337)  评论(0编辑  收藏  举报