viewPaper+Fragment的布局,在初始化时会导致fragment的布局加载和网络请求数据(懒加载)

实现fragment的懒加载。

问题一:

Fragment之间切换时每次都会调用onCreateView方法,导致每次Fragment的布局都重绘,无法保持Fragment原有状态。

        解决办法:在Fragment onCreateView方法中缓存View

private View rootView;//缓存Fragment view

@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

if(rootView==null){

//缓存的rootView需要判断是否已经被加过parent, 如果有parent需要从parent删除,要不然会发生这个rootview已经有parent的错误。

rootView=inflater.inflate(R.layout.tab_fragment, null);

        

ViewGroup parent = (ViewGroup) rootView.getParent();        

if (parent != null) { 

           parent.removeView(rootView);  

  }

 return rootView;

}

这样就能保存状态,避免重发加载布局。

二:防止在初始化viewPaper时创建了其他fragment的布局和加载了数据。(懒加载)

实现思路:只有在当前fragment显示并且布局已经初始化完成后才加载数据。

http://blog.csdn.net/maosidiaoxian/article/details/38300627(此微博有讲创建一个基类Fragment,其他类来继承都可以用。)

下面是我自己写的方法。


1,//先初始化
private boolean isPrepared = false, isVisible = false;//是否加载完成,是否可见。
private View root;
 
  
2,onCreateView方法
 
  
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    root = inflater.inflate(R.layout.infor_fragment, container, false);
    System.out.println("Infor_Fragment----onCreateView");
    isPrepared = true;//表示布局加载好了
    initView(root);
    return root;
}
private void initView(View root) {
    System.out.println("Infor_Fragment----initView");
//只满足一个条件就不会往下执行了,别return了。下面了初始化控件和网络请求
    if (!isVisible || !isPrepared) {
        return;
    }
	//初始化控件、网络请求
}
3,关键方法(fragment有监听布局是否可见的方法)
 
  
 @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        System.out.println("Infor_Fragment----setUserVisibleHint");
        if (getUserVisibleHint()) {
            System.out.println("Infor_Fragment1----" + isVisible);
            isVisible = true;
            initView(root);//两个都为true,这个方法就可以一直往下执行。(此时才加载数据)
        } else {
            System.out.println("Infor_Fragment2----" + isVisible);
            isVisible = false;
	//可以做一些销毁的操作。
        }
    }

这个开发一定用得到,总结:

1,防止fragment重复创建,保存状态减少网络请求,保存状态

2,避免在第一次初始化时创建布局并加载数据。数据请求量非常大。



你可能感兴趣的:(Android)