解决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。



目录
相关文章
|
缓存 测试技术 Android开发
深入探究Android中的自定义View绘制优化策略
【4月更文挑战第8天】 在Android开发实践中,自定义View的绘制性能至关重要,尤其是当涉及到复杂图形和动画时。本文将探讨几种提高自定义View绘制效率的策略,包括合理使用硬件加速、减少不必要的绘制区域以及利用缓存机制等。这些方法不仅能改善用户体验,还能提升应用的整体性能表现。通过实例分析和性能测试结果,我们将展示如何有效地实现这些优化措施,并为开发者提供实用的技术指南。
|
NoSQL MongoDB
mongoTemplate批量保存数据mongoDB批量保存数据
mongoTemplate批量保存数据mongoDB批量保存数据
638 2
|
5月前
|
Java
Java 中 `toList()` 与 `collect(Collectors.toList())` 的微妙差异:别再乱用了!
Java 中 `toList()` 与 `collect(Collectors.toList())` 的微妙差异:别再乱用了!
463 0
|
5月前
|
存储 关系型数据库 分布式数据库
客户说|古茗选用阿里云PolarDB,以云端之力解锁茶饮数字化新高度
阿里云PolarDB将持续以“业务价值”为锚点,通过技术迭代与场景化解决方案,让每一笔交易更流畅,让每一份数据更智能,助力古茗实现“每天一杯喝不腻”的日常化国民茶饮愿景。
|
Android开发 UED 开发者
Android Activity启动模式详解
Android Activity启动模式详解
646 0
|
测试技术 API Android开发
Android经典实战之简化 Android 相机开发:CameraX 库的全面解析
CameraX是Android Jetpack的一个组件,旨在简化相机应用开发,提供了易于使用的API并支持从Android 5.0(API级别21)起的设备。其主要特性包括广泛的设备兼容性、简洁的API、生命周期感知、简化实现及方便的集成与测试。通过简单的几个步骤即可实现如拍照、视频录制等功能。此外,还提供了最佳实践指导以确保应用的稳定性和性能。
569 0
|
存储 API Android开发
29. 【Android教程】折叠列表 ExpandableListView
29. 【Android教程】折叠列表 ExpandableListView
1251 2
使用EventBus 3.0 报 Subscriber class com.example.test.MainActivity and its super classes have no public methods with the @Subscribe annotation
使用EventBus 3.0 报 Subscriber class com.example.test.MainActivity and its super classes have no public methods with the @Subscribe annotation
368 5
|
Java 编译器 开发工具
Idea启动运行“错误:java: 无效的源发行版: 13”,如何解决?
Idea启动运行“错误:java: 无效的源发行版: 13”,如何解决?
Idea启动运行“错误:java: 无效的源发行版: 13”,如何解决?
|
机器学习/深度学习 缓存 API
【Computer Vision】基于ResNet-50实现CIFAR10数据集分类
【Computer Vision】基于ResNet-50实现CIFAR10数据集分类,基于百度飞桨开发,参考于《机器学习实践》所作。
640 1
【Computer Vision】基于ResNet-50实现CIFAR10数据集分类

热门文章

最新文章