Android中ViewPager配合Fragment使用避免重复加载
来源:互联网 发布:用友软件建账步骤 编辑:程序博客网 时间:2024/06/07 19:30
问题
众所周知我们在开发中常常会使用ViewPager和Fragment的组合,但是使用这样的组合页面在滑动的时候会有一些问题,比如从第一页滑动到第四页,再从第四页滑动到第一页,这个时候第一页的fragment会经历自身的两次生命周期的回调(从onCreate到onDestory),那么这个时候,界面被销毁,这个时候我们需要重新生产界面,填充数据。这个是我们不想看到的,每次滑动回来的时候,重新生成界面,重新请求网络数据。
分析
出现这种问题的原因
- 界面被销毁是由于fragment的生命周期被重新调用,创建的view被回收
- 数据重新加载,原因一部分数据设置为局部变量,fragment的生命周期被重新调用后无法获取引用;原因二,部分开发者可能认为fragment的生命周期被重新调用,那么fragment的变量都没有意义了,成员变量也需要重新生成。
解决方案
- 要强调的是fragment的生命周期被重新调用,但是其成员变量并没有被销毁
fragment中数据不需要重复加载,数据可以设置为成员变量,当fragment生命周期重新调用,请求数据的时候首先判断数据是否为空,不为空则不需要请求数据,可以直接用现有数据,当然刷新数据没有问题。
public class FragmentOne extends Fragment {private static final String TAG = FragmentOne.class.getSimpleName();int mIndex;
onCreateView的时候,保存创建的rootview,并且在fragment重新调用onCreateView的时候判断是否为空,如果不为空就不需要重新创建view了,当然这可以判断也可以不断地,可以每次都创建,看需要,如果重复创建view又需要view还原到原来操作的位置,比如listview滑动的位置,这个时候就需要保存一下了。
public class FragmentOne extends Fragment {private static final String TAG = FragmentOne.class.getSimpleName();View mRootView;
@Overridepublic void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); if (mScrollView != null) { outState.putInt("y", mScrollView.getScrollY()); } Log.d(TAG, mScrollView + " , onSaveInstanceState : " + outState);}
- 填充数据,数据有了(不需要网络请求,也就是说不需要等待马上就有数据),界面可以重复创建也可以不重复创建,当然界面生成的时间人肉眼几乎是看不到的,数据和界面都及时生成,那么对于用户来说,就像是fragment的生命周期没有重新调用一样。
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if (mRootView != null) { ButterKnife.bind(this, mRootView); return mRootView; } mRootView = inflater.inflate(R.layout.count_fragment, container, false); ButterKnife.bind(this, mRootView); mCount.setText("" + mIndex);
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View root = inflater.inflate(R.layout.home, container, false); ButterKnife.bind(this, root); mPromotionPager.setAdapter(new PromotionAdapter()); Log.d(TAG, "onCreateView state : " + savedInstanceState); if (savedInstanceState != null) { mScrollView.setScrollY(savedInstanceState.getInt("y")); } return root; }
这样ViewPager每次来回滑动的时候Fragment就不会重复加载数据了。
1 0
- Android中ViewPager配合Fragment使用避免重复加载
- Android中Fragment+ViewPager的配合使用
- Android中Fragment+ViewPager的配合使用
- android viewpager+fragment 避免预加载,缓存
- Android:Fragment 与 ViewPager的配合使用
- Android 保存Fragment状态,避免重复加载
- ViewPager+Fragment避免重复createview
- Android 在 ViewPager 中使用 Fragment 的懒加载
- FragmentTabHost切换Fragment时避免重复加载UI(ViewPager切换Fragment时也适用)
- FragmentTabHost切换Fragment时避免重复加载UI(ViewPager切换Fragment时也适用)
- 关于避免fragment重复加载
- 切换Fragment避免重复加载
- fragment配合viewpager实现懒加载
- 使用ViewPager加载Fragment
- ViewPager与fragment配合使用的优势
- fragment、viewpager、radiogroup的配合使用
- viewPager引导页避免重复加载
- 切换Fragment时避免重复加载UI
- Linux启动过程详解
- ubuntu 安装pip
- python 一个比较好的讲解beanstalkc模块的网站
- 据技术Hadoop入门理论系列之一----hadoop生态圈介绍
- android调用相应的应用市场进行评价功能开发
- Android中ViewPager配合Fragment使用避免重复加载
- hdu1231最大连续子序列(动态规划&最大连续子序列)
- MySqlConnection.get_IsPasswordExpired()异常未将对象引用设置到对象实例
- Android自动化测试(UiAutomator)简要介绍
- 常见浏览器兼容性问题与解决方案
- 在FreeSWITCH中执行长期运行的嵌入式脚本--Lua语言例子
- RabbitMQ 入门 Helloworld
- eclipse adt sdk jdk的关系
- POJ 2796 Feel Good(单调栈)