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

相关推荐

  1. Android ViewPagerViewPager2区别

    2024-06-09 04:30:01       25 阅读
  2. C#面:MVC中TempData\ViewBag\ViewData区别?

    2024-06-09 04:30:01       25 阅读
  3. vue2vue3区别

    2024-06-09 04:30:01       56 阅读
  4. Vue3Vue2区别

    2024-06-09 04:30:01       51 阅读
  5. Vue2Vue3区别

    2024-06-09 04:30:01       62 阅读
  6. Vue2Vue3区别

    2024-06-09 04:30:01       48 阅读
  7. vue2vue3区别

    2024-06-09 04:30:01       51 阅读
  8. vue2vue3区别

    2024-06-09 04:30:01       47 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-09 04:30:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-09 04:30:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-09 04:30:01       87 阅读
  4. Python语言-面向对象

    2024-06-09 04:30:01       96 阅读

热门阅读

  1. 使用vue3+ts封装一个Slider滑块组件

    2024-06-09 04:30:01       24 阅读
  2. 标题:CSRFTester:自动化探测 CSRF 漏洞的利器

    2024-06-09 04:30:01       30 阅读
  3. 开发服务器——webpack-dev-server

    2024-06-09 04:30:01       27 阅读
  4. MySQL8sql_model的问题

    2024-06-09 04:30:01       30 阅读
  5. numpy除以0时赋值100

    2024-06-09 04:30:01       28 阅读
  6. python对视频进行帧处理以及裁减部分区域

    2024-06-09 04:30:01       26 阅读
  7. Vue Router源码分析

    2024-06-09 04:30:01       24 阅读
  8. 7.0 android中Service的基础知识

    2024-06-09 04:30:01       28 阅读
  9. python的sql解析库-sqlparse

    2024-06-09 04:30:01       23 阅读