您的位置:首页 > 理论基础 > 计算机网络

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

2016-07-12 13:56 417 查看
实现fragment的懒加载。问题一:Fragment之间切换时每次都会调用onCreateView方法,导致每次Fragment的布局都重绘,无法保持Fragment原有状态。        解决办法:在Fragment onCreateView方法中缓存Viewprivate View rootView;//缓存Fragment view@Overridepublic 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方法
@Overridepublic 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有监听布局是否可见的方法)
 @Overridepublic 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,避免在第一次初始化时创建布局并加载数据。数据请求量非常大。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息