当前位置: 首页 > 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

http://www.lryc.cn/news/362495.html

相关文章:

  • Oracle数据库面试题-3
  • 21.过拟合和欠拟合示例
  • 使用import语句导入模块
  • 一台FreeBSD笔记本突然鼠标乱动=>pf防火墙设置@FreeBSD
  • 身份证OCR识别功能介绍
  • 一文看懂:MES定义和功能是什么,以及在数字化工厂的应用
  • 对 SQL 说“不”~
  • 【爱空间_登录安全分析报告】
  • web前端三大主流框架
  • git获取的项目无法运行
  • java 原生http服务器 测试JS前端ajax访问实现跨域
  • 捋一捋C++中的逻辑运算(一)——表达式逻辑运算
  • qcom 平台系统签名流程
  • 从零开始实现自己的串口调试助手(5) -实现HEX显示/发送/接收
  • 【计算机毕设】基于SpringBoot的民宿在线预定平台设计与实现 - 源码免费(私信领取)
  • 大数据—数据分析概论
  • centos7下卸载MySQL,Oracle数据库
  • Spring解决循环依赖
  • RUST运算符重载
  • 描述一下 Array.forEach() 循环和 Array.map() 方法之间的主要区别
  • 在GEE中显示矢量或栅格数据的边界(包含样式设计)
  • django使用fetch上传文件
  • linux安装docker步骤
  • Unity DOTS技术(一)简介
  • 深度解读ChatGPT基本原理
  • python实现——分类类型数据挖掘任务(图形识别分类任务)
  • 【安卓跨进程通信IPC】-- Binder
  • 大数据之Schedule调度错误(一)
  • DiffIR论文阅读笔记
  • prometheus+alertmanager+webhook钉钉机器人告警