解决ViewPager+多Fragment切换出现空白页面的问题

简介: 解决ViewPager+多Fragment切换出现空白页面的问题

项目的主页框架是采用Activity+Fragment的架构,由于项目需求,在第一个Fragment中又采用的是TabLayout+ViewPager+Fragment的结构,假设我这里有5个子Fragment,第一个子Fragment中有控件、数据这些东西,当我从第1个滑动到第5个Fragment,再往回滑到第1个Fragment的时候,我的第一个Fragment中的控件没了,页面是空白的。具体情况如下图中所示:


9.gif

来看具体问题对比:image.png说明一下数据还在是因为数据这部分是第一个子Fragment中又嵌套了两个子Fragment用来处理已审批和未审批列表的,所以通过对比图可以看到第一个子Fragment中的TabLayout已经不见了。


问题原因:动态加载Fragment,页面显示空白,就是onCreateView()方法每次都调用导致的,这样fragment每次都会设置新的View,并且之前的View并没有被回收,这就导致了新的View覆盖了旧的View,旧View不显示。


问题解决:我在网上找了很多资料,并且选取了其中两种我认为最为快速的最优解,这里提供给大家。


第一种:将ViewPager的预加载个数设置为你的所有Fragment的数量,就是说有几个Fragment就设为几。其实我之前采用这种布局方式的时候都是设为最大数量的,所以一直没有遇到过这个问题,由于这个项目中不同的账号看到的页面都是不同的,Fragment的数量是不固定的,所以这里就随手写了个1,因为ViewPager会默认有这个预加载机制,通过查看源码可以发现,系统默认设置的加载页数就是1,就是说当你数量小于1的时候,它也会默认给你设置成1。现在已经修改成通过用户权限的接口来动态控制加载页面的个数了,所以修改为fragment.size了,错误代码如下:


mViewPager.setOffscreenPageLimit(1); //预加载

正确的写法应该是:


mViewPager.setOffscreenPageLimit(mFragments.size()); //预加载

第二种:首先来看ViewPager适配器中的代码:


[java] view plain copy

public class ContractManAdapter extends FragmentPagerAdapter {  

   private List mTitles;  

   private List mFragments;  

 

   public ContractManAdapter(FragmentManager fm, List mTitles, List mFragments) {  

       super(fm);  

       this.mTitles = mTitles;  

       this.mFragments = mFragments;  

   }  

 

   @Override  

   public Fragment getItem(int position) {  

       return mFragments.get(position);  

   }  

 

   @Override  

   public int getCount() {  

       return mFragments.size();  

   }  

 

   @Override  

   public CharSequence getPageTitle(int position) {  

       return mTitles.get(position);  

   }  

 

}  

在ViewPager的适配器中再重写destroyItem()方法,并且删除super.destroyItem(container, position, object); 这行代码,代码如下:

@Override

public void destroyItem(ViewGroup container, int position, Object object) {

 

}

这两种方式是亲测可用的。


第三种:这种方式是在网上看到的,我没有实际操作过,这种要比上面两种复杂一点,这里说一下思路:在onCreateView()中判断Fragment中是否已经添加了contentView,第一次加载时,可以将view保存下来,之后再加载时判断保存的view是否为空,如果为空,则return新加载的view,如果不为空,先将保存的view从父view中移除,然后再return该view。



目录
相关文章
|
编解码 iOS开发 开发者
App上架Apple App Store和Google Play流程
App上架Apple App Store和Google Play流程
950 2
|
7月前
|
安全 应用服务中间件 nginx
Docker 命令大全:从入门到生产,全场景核心指令全覆盖
本文系统讲解Docker核心原理与实战命令,涵盖Namespace、CGroup、UnionFS三大底层机制,详解镜像构建/拉取/安全扫描、容器全生命周期管理、数据卷与网络配置、Compose编排及生产最佳实践,内容全面、示例丰富、贴合v27.0.3最新版。
1703 2
|
11月前
|
人工智能 智能硬件
吃碗面的功夫,我随口用“灵光”搓出一个有8大功能的app,还不止(含三大应用解锁)
法思诺创新学院关注AI赋能实体产业。本文通过体验蚂蚁集团“灵光”AI,展示其快速生成英语学习APP、智能音箱界面及3D模型的能力,尤其“闪应用”与“灵光开眼”在企业研发、培训中的潜力,探讨AI从虚拟走向物理世界的关键突破。
1489 2
HarmonyOS实战:Tab顶部滑动悬停功能实现
在鸿蒙开发中,实现Scroll嵌套List列表滑动时顶部悬停的效果是一个常见需求。本文详细介绍了如何通过布局和事件处理来实现这一功能。首先,使用Scroll嵌套List和Tab布局来构建基础页面。然后,通过设置nestedScroll属性为NestedScrollMode.PARENT_FIRST,确保外层Scroll优先滑动。接着,通过监听List和Scroll的滑动事件,处理滑动冲突,确保在特定条件下Scroll停止滑动,将滑动事件交给List处理。最终,实现了在上下滑动时优先让Scroll滑动的效果,并提供了扩展思路,如优先让List滑动等。
653 10
HarmonyOS实战:Tab顶部滑动悬停功能实现
|
存储 关系型数据库 分布式数据库
客户说|古茗选用阿里云PolarDB,以云端之力解锁茶饮数字化新高度
阿里云PolarDB将持续以“业务价值”为锚点,通过技术迭代与场景化解决方案,让每一笔交易更流畅,让每一份数据更智能,助力古茗实现“每天一杯喝不腻”的日常化国民茶饮愿景。
|
Prometheus 监控 算法
CMS圣经:CMS垃圾回收器的原理、调优,多标+漏标+浮动垃圾 分析与 研究
本文介绍了CMS(Concurrent Mark-Sweep)垃圾回收器的工作原理、优缺点及常见问题,并通过具体案例分析了其优化策略。重点探讨了CMS的各个阶段,包括标记、并发清理和重标记
CMS圣经:CMS垃圾回收器的原理、调优,多标+漏标+浮动垃圾 分析与 研究
|
人工智能 监控 Java
一文搞清楚HarmonyOS NEXT中状态管理 V1 版本:父子组件数据传递装饰器的奇妙之旅
本文深入浅出地介绍了HarmonyOS NEXT开发中状态管理V1版本的两个核心装饰器:@Prop和@Link。@Prop如同单向传递的快递员,负责将数据从父组件传递到子组件,但子组件的修改不会影响父组件;@Link则像心灵感应的双胞胎,实现父组件与子组件间的数据双向同步。通过魔法按钮和能量水晶的生动示例,文章详细解析了两者的使用场景、参数特性及同步机制,并以浅拷贝和深拷贝为比喻,帮助开发者更好地理解数据传递中的细节。掌握这两位“信使”,能让组件间的协作更加高效可靠!
663 14
一文搞清楚HarmonyOS NEXT中状态管理 V1 版本:父子组件数据传递装饰器的奇妙之旅
|
索引
鸿蒙开发:自定义切换动画实现Swiper层叠滑动效果
customContentTransition不仅仅可以实现平移上的改变,很多的效果,我们都可以实现,比如放大缩小,旋转等等。
624 2
鸿蒙开发:自定义切换动画实现Swiper层叠滑动效果
|
自然语言处理 fastjson Java
记一次细思极恐的FastJson差点引发的大面积故障
作者记录了一次FastJson差点引发的大面积故障的排查过程和解决方案。
|
Android开发
android.view.WindowLeaked的解决办法
我们知道Android的每一个Activity都有个WindowManager窗体管理器,同样,构建在某个Activity之上的对话框、PopupWindow也有相应的WindowManager窗体管理器。
539 0