实现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,避免在第一次初始化时创建布局并加载数据。数据请求量非常大。