我来谈谈ViewPager搭配FragmentAdapter的数据丢失问题

先来一张碎片Fragment的生命周期图开开胃......

首先呢,我来介绍一下:

当我们使用Viewpager搭配FragmentPagerAdapter进行滑动的时候,某些情况下会发现前边几页自己手动产生的数据会被清空掉,对于这个碎片的滑动:

它的出现和消失只是和Activity一样,是一个是否在栈顶的关系,当非栈顶碎片出现再栈顶的时候,它就会从碎片的onCreateView这个生命周期开始走到onDestroyView之前,如果你把adapter这种装数据的对象放在了onCreateView及以下的生命节点里,当碎片重新回到栈顶之后,adapter一定会被重新创建,所以数据丢失。。。。解决方案就是将adapter的实例化放在onCreate里。

再来谈谈如果将adapter的实例化放在了onCreateView及以下的解决方案:

使用setOffscreenPageLimit来设置ViewPager的预加载页数,可以同样保存数据。这个东西它的作用是预加载下x个页面,当我们预加载的页数x大于等于 总页数-1时,也就是说,在第一次如果就预加载了所有的页面,今后的滑动所有页面的每一个生命周期都不会再走一次,相当于栈顶有多个碎片。。。。当然啦,如果不是所有,随着总有一个以上的碎片被压入栈顶以下,肯定会有数据的丢失,除非你把adapter的初始化重放一下位置。。。。

源码解析(转):http://blog.csdn.net/bob1993_dev/article/details/46491797

时间: 2024-11-05 00:00:19

我来谈谈ViewPager搭配FragmentAdapter的数据丢失问题的相关文章

android中viewPager+fragment实现的屏幕左右切换(进阶篇)

Fragment支持在不同的Activity中使用并且可以处理自己的输入事件以及生命周期方法等.可以看做是一个子Activity. 先看一下布局: 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match

ViewPager之Fragment页面切换

一.概述 ViewPager是android-support-v4中提供的类,它是一个容器类,常用于页面之间的切换. 继上篇文章<ViewPager之引导页>之后,本文主要介绍ViewPager更为通用的实践:ViewPager搭配Fragment实现页面切换. 这种实现方式相对于上篇文章而言,可以更好的支持不同页面各自的复杂逻辑,与此同时,也能够保障页面之间的耦合度尽可能的低. 按照惯例,先晒出效果图:        二.实现思路 首先分析一下不同区域的交互需求: 中间灰色区域除了要支持三套

Fragment嵌套带来的坑--页面点击无反应(顺带ViewPager之 FragmentPagerAdapter简单分析)

接手别人的老项目.新版本测试提出一个bug: 点击Home最小化的应用->系统设置界面 改变字体后->点击进入应用->3个由viewpager 的fragmentadapter管理的 tab页面点击都没反应. 这是一个比较蛋疼的bug,猜想了很多原因,都不对. 项目的结构是 activity 内有mainfragment,mainfragment又 包含viewpager,viewpager 使用FragmentPagerAdapter 管理3个页面.所以是 activity套2层fra

承上启下

因为代码太多了,所以只能分两次发上来: 各位看官请见谅啊 /**   * 根据频道完成频道分类布局   */ private void initTab() { tabContainer.removeAllViews(); int count=defaultChannels.size(); LayoutInflater inflater=LayoutInflater.from(this); for(int i=0;i<count;i++){ RadioButton columnRadio=(Rad

TabLayout学习笔记

配合ViewPager使用,基本布局如下: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent&q

PhotoView

一.PhotoView的作用 PhotoView是继承ImageView的自定义控件,支持双击或者双指缩放.不仅支持单个的ImageView,同时也能与ViewPager.ScollView等父控件很好的兼容,亦能与ImageLoader.Picasso等异步加载网路图片的框架很好的兼容. 二.使用 PhotoView的使用其实很简单,其关键点就是处理Touch事件和Matrix图形变换. 1.单张图片的图形变换 要想处理图片的图形变换,首先要获取PhotoViewAttacher对象. Pho

Android Fragment真正意义上的onResume和onPause

Fragment虽然有onResume和onPause的,但是这两个方法是Activity的方法,调用时机也是与Activity相同,和ViewPager搭配使用这个方法就很鸡肋了,根本不是你想要的效果,这里介绍一种方法. 覆写Fragment 的setUserVisibleHint方法即可: @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisible

Fragment的可见再加载的方法(真正的Fragment的OnResume和OnPause)

一 起因 我们在做应用的过程中,一个应用的界面可能是多个Fragment切换而成的,但是如果在每次应用启动的时候就去加载大量的网络数据(假设你的每个Fragment都需要加载网络数据,你也可以理解为初始化大量资源)肯定是不好的,能不能有一种方法可以在我们看到我们的Fragment时再去加载对应的Fragment的数据呢? 当然是有的. 二 解决 Fragment虽然有onResume和onPause的,但是这两个方法是Activity的方法,调用时机也是与Activity相同,和ViewPage

智慧city

# 智慧北京黑马74期笔记 # # 智慧北京黑马74期笔记 # ## 项目角色 ## - 产品经理(产品狗,产品汪) 决定开发什么东西, 需求文档(原型图) - 程序员(码农, 程序猿, 攻城狮) 负责开发 - Android开发工程师 - IOS开发工程师 - 服务器开发工程师JavaEE/PHP/.Net (接口文档) - 视觉设计师/UI设计师(美工) 效果图, 切图 1280*720分辨率(主流分辨率) - 测试工程师 - 运营(销售, 推广, 打广告, 写软文) ## 开发流程 ##