当前位置: 首页 > news >正文

Android ViewPager和ViewPager2的区别

一、实现方式

ViewPager内部是通过继承ViewGroup来实现的,ViewPager2内部是通过RecyclerView来实现的(效率更高)

二、支持方向

ViewPager只能横向滑动,ViewPager2可以横向以及竖向滑动

三、采用的适配器

ViewPager有两个适配器分别是FragmentStatePagerAdapterFragmentPagerAdapter,都集成自PagerAdpter

FragmentStatePagerAdapter:不可以缓存,Fragment离开屏幕时,该适配器会销毁该Fragment并释放其资源,而在Fragment重新进入屏幕时,该适配器又会重新创建该Fragment。这种管理方式适合于Fragment数量较多或占用内存较大的情况,因为它可以在不需要的Fragment上释放内存。但是这也会导致Fragment的状态丢失,需要在Fragment中保存和恢复状态。

FragmentPagerAdapter:可以缓存,在Fragment离开屏幕时,该适配器并不会销毁该Fragment,而是将其保存在内存中,以便下一次使用时可以直接取出。

这种管理方式适合于Fragment数量较少或占用内存较小的情况,因为它可以避免频繁的Fragment销毁和重建,提高了性能。但是如果Fragment数量过多,可能会导致内存占用过高,从而引发内存溢出等问题。

总结:如果需要管理大量或占用内存较大的Fragment,应该选择FragmentStatePagerAdapter;如果Fragment数量较少或占用内存较小,应该选择FragmentPagerAdapter

ViewPager2只有一个适配器FragmentStateAdapter,集成自RecyclerView.Adapter,该适配器有以下特点

1.FragmentStateAdapter在遇到预加载时,只会创建Fragment对象,不会把Fragment真正的加入到布局中,所以自带懒加载效果;

2.FragmentStateAdapter不会一直保留Fragment实例,回收的ItemView也会移除Fragment,所以得做好Fragment重建后恢复数据的准备;

3.FragmentStateAdapter在遇到offscreenPageLimit>0时,处理离屏Fragment和可见Fragment没有什么区别,所以无法通过setUserVisibleHint判断显示与否。

四、功能支持

ViewPager有两个弊端

1、不能关闭预加载

2、更新adapter不生效

我们在加载数据的时候,viewpager默认会帮我们预加载前后两个页面的数据,并且这2个view是不可见的。

由于viewpager对offscreenPageLimit做了限制,默认设置为1,因此页面的预加载不可避免。这也容易造成资源浪费。

一般使用viewpager与frament配合使用,利用fragment的setUserVisibleHint方法,来实现控制数据懒加载。而布局只能提前进入(预布局)。

ViewPager2离屏加载和预加载

ViewPager2的预加载与离屏加载在view层面有着本质的区别,离屏加载的view已经添加到parent上,而预加载只是准备了布局,并没有加载到parent上。

1.ViewPager2默认是开启预加载关闭离屏加载的,可能会预加载一条数据,而离屏加载即设置offscreenPageLimit为0。

2.ViewPager2设置offscreenPageLimit为1时,在第1页会加载2条数据,每滑动一页,都会加载下一页数据,直到第五页,会移除第一页数据。

ViewPager2内部实现了懒加载,通过Lifecycle对Fragment的生命周期进行管理。而ViewPager需要自己实现懒加载。

ViewPager2提供了一些新的功能,如无从右到左(RTL)的布局支持和停用用户输入的功能(setUserInputEnabled、isUserInputEnabled)。

五、对于ItemDecoration的支持不同

ViewPager自身并不支持ItemDecoration,如果需要添加分割线等效果,需要手动实现。而ViewPager2可以直接使用RecyclerView的ItemDecoration来实现分割线等效果。

参考链接:

https://www.cnblogs.com/fangg/p/12768038.html

https://blog.csdn.net/qq_40840459/article/details/132402056

相关文章:

  • jenkins插件之plot
  • TypeScript 在前端开发中的应用
  • 品牌舆情监测系统是什么?怎么监测?
  • Hbase 面试题(七)
  • PDF编辑流程,另附5款好用的PDF编辑器
  • 2024.5.29晚训参考代码
  • 解析《动物园规则怪谈》【逻辑】
  • ffmpeg.dll在哪个文件夹?怎么快速的修复ffmpeg.dll文件的丢失
  • vue2实现将el-table表格数据导出为长图片
  • Qt富文本语法高亮
  • 解决splice改变原数组的BUG!
  • mmdet3D中文注释
  • 企业微信H5授权登录
  • C# 解决 Excel 自动适应列宽的问题
  • Fatfs
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • egg(89)--egg之redis的发布和订阅
  • es6要点
  • Java多线程(4):使用线程池执行定时任务
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • ⭐ Unity + OpenCV 实现实时图像识别与叠加效果
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 创建一种深思熟虑的文化
  • 前端设计模式
  • 入口文件开始,分析Vue源码实现
  • 我与Jetbrains的这些年
  • ionic入门之数据绑定显示-1
  • 阿里云API、SDK和CLI应用实践方案
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • ![CDATA[ ]] 是什么东东
  • %@ page import=%的用法
  • (11)iptables-仅开放指定ip访问指定端口
  • (2024最新)CentOS 7上在线安装MySQL 5.7|喂饭级教程
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (C++二叉树05) 合并二叉树 二叉搜索树中的搜索 验证二叉搜索树
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (六)c52学习之旅-独立按键
  • (转)关于pipe()的详细解析
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • 、写入Shellcode到注册表上线
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .NET 漏洞分析 | 某ERP系统存在SQL注入
  • .NET开源项目介绍及资源推荐:数据持久层
  • @开发者,一文搞懂什么是 C# 计时器!
  • [ C++ ] STL---string类的使用指南
  • [ vulhub漏洞复现篇 ] ThinkPHP 5.0.23-Rce
  • [.net]官方水晶报表的使用以演示下载
  • [001-03-007].第07节:Redis中的事务