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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/24175.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法:70. 爬楼梯

70. 爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例 1: 输入:n 2 输出:2 解释:有两种方法可以爬到楼顶。 1. 1 阶 1 阶 2. 2 阶 示…

【CTF MISC】XCTF GFSJ0170 János-the-Ripper Writeup(文件提取+ZIP压缩包+暴力破解)

Jnos-the-Ripper 暂无 解法 用 winhex 打开,提到了 flag.txt。 用 binwalk 扫描,找到一些 zip 压缩包。 binwalk misc100用 foremost 提取文件。 foremost misc100 -o 100flag.txt 在压缩包里。 但是压缩包需要解压密码。 用 Ziperello 暴力破解。 不…

mac安装nigix且配置 vue/springboot项目(本地/服务器)

一、mac安装Nigix 1. 查看是否存在 nginx 执行brew search nginx 命令查询要安装的软件是否存在 brew search nginx 2. 安装nginx brew install nginx 3. 查看版本 nginx -v 4. 查看信息 查看ngxin下载的位置以及nginx配置文件存放路径等信息 brew info nginx 下载的存…

Angular 由一个bug说起之六:字体预加载

浏览器在加载一个页面时,会解析网页中的html和css,并开始加载字体文件。字体文件可以通过css中的font-face规则指定,并使用url()函数指定字体文件的路径。 比如下面这样: css font-face {font-family: MyFont;src: url(path/to/font.woff2…

【路径规划】三维深度矩阵寻路算法

在三维空间中寻路相较于二维空间更为复杂,因为需要处理额外的维度。下面是一个示例,展示了如何使用深度优先搜索(DFS)算法在三维矩阵中寻找路径。 首先,我们需要定义三维矩阵,并编写一个递归的DFS函数来寻…

IDEA 中设置 jdk 的版本

本文介绍一下 IDEA 中设置 jdk 版本的步骤。 一共有三处需要配置。 第一处 File --> Project Structure Project 和 Modules 下都需要指定一下。 第二处 File --> Settings 第三处 运行时的配置

Linux基础2-基本指令4(cp,mv,cat,tac)

上篇文章我们说到了rmdir,rm,man,echo.重定向等知识。 Linux基础1-基本指令3-CSDN博客 本文继续梳理其他基础指令 1.本章重点 1.使用cp命令拷贝文件 2.使用mv命令移动文件 3.使用cat,tac查看小文本文件 2.cp命令 在linux中使用cp命令来拷贝粘贴文件 cp src(原文…

解决Nginx出现An error occurred问题

每个人遇到Nginx的An error occurred情况可能都不一样(见图1),Nginx造成该错误的原因: 1. 我在配置域名解析成IP时,没有把所有解析配置都修改,见图2:解析 *.hanxiaozhang.xyz 配置的是新IP地…

【名词解释】Unity的Inputfield组件及其使用示例

Unity的InputField组件是一个UI元素,它允许用户在游戏或应用程序中输入文本。InputField通常用于创建表单、登录界面或任何需要用户输入文本的场景。它提供了多种功能,比如文本验证、占位符显示、输入限制等。 功能特点: 文本输入&#xff…

如何发布自己的npm插件包

随着JavaScript在前端和后端的广泛应用,npm(Node Package Manager)已成为JavaScript开发者不可或缺的工具之一。通过npm,开发者可以轻松共享和使用各种功能模块,极大地提高了开发效率。那么,如何将自己开发的功能模块发布为npm插件包,与全球的开发者共享呢?本文将进行全…

Nvidia Jetson/Orin/算能 +FPGA+AI大算力边缘计算盒子:潍柴雷沃智慧农业无人驾驶

潍柴雷沃智慧农业科技股份有限公司,是潍柴集团重要的战略业务单元,旗下收获机械、拖拉机等业务连续多年保持行业领先,是国内少数可以为现代农业提供全程机械化整体解决方案的品牌之一。潍柴集团完成对潍柴雷沃智慧农业战略重组后,…

JSON5:JSON的现代化扩展

JavaScript Object Notation (JSON),被广泛应用于网络传输、配置文件等许多地方,因其简洁、易读的特性而备受欢迎。然而,JSON不是无可指摘的,限制太过严格,使得一些场景变得棘手。这时候,JSON的超集——JSO…

轻松解决问题!教你文件怎么解除只读模式!

在日常使用电脑时,我们有时会遇到文件或文件夹被设定为只读模式的情况,这可能会限制我们对文件的修改和编辑。然而,解除只读模式并获得文件的完全控制是一个相对简单的过程,只需要掌握一些基本的技巧和方法。在本文中,…

数据分析面试常问问题(二)(SQL、统计学、业务方面等)

一、数据分析之业务指标高频面试题 1.关于视频app(比如爱奇艺)首页推荐的推荐顺序,你会考虑哪些指标? (1)用户行为数据:浏览、点击、播放、搜索、收藏、点赞、转发、滑动、在某个位置的停留时…

java版spring cloud 知识付费平台的功能模块与子模块划分

随着互联网技术的飞速发展,知识付费平台已经成为了我国在线教育领域的一颗新星。这些平台以用户需求为出发点,围绕高质量的内容打造,利用互联网技术为用户提供了一个便捷、高效的学习环境。它们汇聚了丰富的专业知识,覆盖了职业技…

【时序约束】如何确定输入输出信号的时序约束值

确定输入输出信号的时序约束值是 FPGA 设计中的一个重要步骤,它涉及到对信号传输时间和 FPGA 内部时序要求的准确理解。以下是确定时序约束值的一些关键步骤: 1. 理解信号特性 输入信号:考虑输入信号的来源、传输距离、走线长度以及是否经过…

打造精美电子画册,提升企业形象的方法

在当今数字化时代,企业形象的表达方式正在发生深刻变革。精美电子画册作为一种新兴的传播媒介,不仅能够展现企业风采、提升品牌价值,还能够吸引潜在客户、增强市场竞争力。 接下来告诉大家一些简单的制作方法,可以收藏起来哦 1.首…

【免费】2021年数学建模国赛C题问题一--基于熵权法和TOPSIS法详细版附Word加代码

各位大佬好 ,这里是阿川的博客,祝您变得更强 个人主页:在线OJ的阿川 大佬的支持和鼓励,将是我成长路上最大的动力 阿川水平有限,如有错误,欢迎大佬指正 Python 初阶 Python–语言基础与由来介绍 Python–…

刷代码随想录有感(95):合并区间

题干&#xff1a; 代码&#xff1a; class Solution { public:static bool cmp(vector<int>& a, vector<int>& b){return a[0] < b[0];}vector<vector<int>> merge(vector<vector<int>>& intervals) {sort(intervals.begi…

AO|天鹰优化算法原理及代码实现(MATLAB/Python)

文章来源于我的个人公众号&#xff1a;KAU的云实验台&#xff0c;主要更新智能优化算法的原理、应用、改进 天鹰优化算法(Aquila Optimizer&#xff0c;AO)是Abualigah等[1]于2021年发表在SCI二区Computers & Industrial Engineering的元启发式优化算法。该算法通过模拟天鹰…