【Android】ViewPager与ViewPager2之间的区别

ViewPager 和 ViewPager2 都是 Android 中用于实现滑动页面切换的控件,但 ViewPager2 是对 ViewPager 的改进和增强版本。

区别

实现方式

  • ViewPager 继承自 ViewGroup,内部并未使用已有的成熟控件,更多的是自定义的操作。
  • ViewPager2 也继承自 ViewGroup,但其内部基于 RecyclerView 实现,这意味着性能的提升,因为 ViewHolder 减少了内存开销,同时 RecyclerView 相关方法在 ViewPager2 中也可以看到类似封装 。

滑动方向

  • ViewPager2 支持垂直和水平方向滑动,而 ViewPager 仅支持水平方向滑动 。

上面提到其内部基于 RecyclerView 实现,那么我们需要使其垂直滑动只需要在布局文件里面添加一句话

android:orientation="vertical"

Adapter(适配器)

  • ViewPager 使用 PagerAdapterFragmentPagerAdapterFragmentStatePagerAdapter 作为其适配器。
  1. PagerAdapter
    • PagerAdapter 是最基本的适配器,用于管理非 Fragment 的页面。
    • 它提供了 instantiateItem(ViewGroup container, int position)destroyItem(ViewGroup container, int position, Object object) 方法来控制页面的创建和销毁。
    • PagerAdapter 需要手动管理页面的缓存和复用,这可能会导致内存泄漏,如果页面中的资源没有正确释放。
  2. FragmentPagerAdapter
    • FragmentPagerAdapterPagerAdapter 的子类,专为 Fragment 设计。
    • 它管理一个 Fragment 的集合,每个 Fragment 代表一个页面。
    • FragmentPagerAdapter 会缓存所有的 Fragment 实例,即使它们没有显示在屏幕上。这意味着即使用户导航离开了某个页面,该页面的 Fragment 仍然存在,这有助于保持状态,但也可能增加内存使用。
  3. FragmentStatePagerAdapter
    • FragmentStatePagerAdapter 也是 PagerAdapter 的子类,同样用于 Fragment
    • FragmentPagerAdapter 不同的是,FragmentStatePagerAdapter 只会保留当前页面和直接相邻页面的 Fragment 实例。当页面不可见时,它的 Fragment 会被销毁,只保留必要的信息以恢复该页面。
    • 这种适配器适用于页面数量较多的情况,或者当页面状态不重要时,可以帮助减少内存使用。
  • ViewPager2 使用 RecyclerView.Adapter,并且对于 Fragment,使用 FragmentStateAdapter 作为其适配器 。

懒加载

  • ViewPager 默认执行预加载,如果需要懒加载的话,需要自行封装。
  • ViewPager2 默认执行懒加载,但是依旧可以设置预加载 。

ViewPager2使用示例

public class MyFragmentTitleAdapter extends FragmentStateAdapter {
    private List<Fragment> mfragmentList;

    public MyFragmentTitleAdapter(@NonNull FragmentActivity fragmentActivity, List<Fragment> fragments) {
        super(fragmentActivity);
        this.mfragmentList = fragments;
    }

    @NonNull
    @Override
    public Fragment createFragment(int position) {
        return mfragmentList == null ? null : mfragmentList.get(position);
    }

    @Override
    public int getItemCount() {
        return mfragmentList.size();
    }
}
  1. createFragment(int position)
    • 这个方法是根据位置 position 创建一个 Fragment 实例。这是实现页面滑动功能的关键方法,你需要在这里返回对应位置的 Fragment
  2. getItemCount()
    • 这个方法返回 ViewPager2 中页面的总数。这个数字应该等于你想要在 ViewPager2 中显示的 Fragment 的数量。
  3. public MyFragmentTitleAdapter():
    • 构造适配器的方法

接下来我们只需要在活动当中获取ViewPager2,并对其创建适配器将其设置进去即可,你就可以看到与相册一样左右滑动切换Fragment,当我们把布局文件设置为垂直滑动图片就会与抖音一样垂直滑动的效果。

上面实现了ViewPagerTabLayout的绑定,对于ViewPager2写法不同,ViewPager2TabLayout 的集成更加简化,通过 TabLayoutMediator 类来实现。TabLayoutMediator 负责在 ViewPager2TabLayout 之间建立联系,自动处理页面变化和 tab 选中状态的同步。

TabLayoutMediator 还支持动态更改标签的数量、内容和样式。

实例:

mviewPager = view.findViewById(R.id.home_vp);
mtabLayout = view.findViewById(R.id.table_layout);
initData(); //初始化碎片集合
myFragmentTitleAdapter = new MyFragmentTitleAdapter(getActivity(), mfragmentList);
mviewPager.setAdapter(myFragmentTitleAdapter);
new TabLayoutMediator(mtabLayout, mviewPager, new     TabLayoutMediator.TabConfigurationStrategy() {
    @Override
    public void onConfigureTab(@NonNull TabLayout.Tab tab, int i) {
        tab.setText("Tab" + (i + 1));
    }
}).attach();
  1. TabLayoutMediator.TabConfigurationStrategy:这是一个回调接口,用于配置每个 Tab 的内容。在这个例子中,它被用来设置每个标签的文本。
  2. onConfigureTab(TabLayout.Tab tab, int i):这是 TabConfigurationStrategy 接口的实现方法。对于 ViewPager2 中的每个页面,这个方法都会被调用一次,以便配置对应的 Tab
    • @NonNull TabLayout.Tab tab:这是当前需要配置的 Tab 对象。
    • int i:这是当前 Tab 的位置索引,从 0 开始。
  3. tab.setText("Tab" + (i + 1)):这行代码设置了每个 Tab 的文本。
  4. ).attach():这是 TabLayoutMediator 的构造函数的结束,attach() 方法用于将中介与 TabLayoutViewPager2 绑定,并激活这个绑定关系。在调用 attach() 之后,TabLayoutMediator 将开始监听 ViewPager2 的页面变化,并自动更新 TabLayout 中的标签状态。

在这里插入图片描述

此时页面就与上面的TabLayout绑定了。

文章到这里就结束了!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【verilog】模十计数器

文章目录 前言代码 前言 进行 FPGA 模十计数器 实验 仿真结果 代码 主代码 // module module count(clk,rst_n,count,clk1,led);// def io input clk; input rst_n; output reg [3:0] count; output reg clk1; output reg [7:0] led;// always part, or main() always (pos…

【吐槽】豪斯医生之二:第 4-6 集

写在前面 5841 字 | 医学 | 吐槽 | 电视剧 正文 维基百科&#xff1a;   利巴韦林&#xff08;英语&#xff1a;Ribavirin&#xff0c;俗称病毒唑&#xff09;&#xff0c;是一种抗病毒药&#xff0c;属合成核苷类药&#xff0c;1970 年由 ICN 制药公司 Joseph T. Witkowsk…

景区导航地图怎么实现?基于LBS与3D GIS的智慧景区导航导览系统技术路线

随着经济的发展和人们物质生活水平改善,居民的旅游需求呈现多元化和个性化&#xff0c;自助旅游的人越来越多。许多游客在旅游行程中需要随时随地了解旅游景点有关的各类信息&#xff0c;如旅游景点介绍、推荐路线、地图导航等&#xff0c;合理规划和安排旅游线路。正是为了应对…

Docker | images镜像的常用命令总结

命令总结 1. 帮助启动类命令基本命令systemctl status dockerdocker infodocker --help 2. 镜像命令docker images删除镜像出现错误 docker searchdocker pull xxx[:TAG]docker images -adocker images -qdocker system dfdocker rmi -f xxxxxdocker rmi -f $(docker images -q…

Python量子生成对抗网络QGAN神经网络药物发现、多方法乳腺癌药物筛选应用

全文链接&#xff1a;https://tecdat.cn/?p37975 分析师&#xff1a;Chenhao Wu 在当今的医学领域&#xff0c;乳腺癌作为一种严重威胁女性健康的疾病&#xff0c;其治疗一直是科研工作者们关注的焦点。乳腺癌的发展与雌激素受体密切相关&#xff0c;其中 ERα 被视为治疗乳腺…

还愁布线呢?那是你没看过这篇

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 上午好&#xff0c;我的网工朋友 综合布线作为网工工作中的基础部分&#xff0c;其设计和实施的质量直接影响到整个系统的稳定性和可靠性。对于咱…

面了 minimax 大模型算法岗,问的贼细!

不同以往的是&#xff0c;当前职场环境已不再是那个双向奔赴时代了。求职者在变多&#xff0c;HC 在变少&#xff0c;岗位要求还更高了。 最近&#xff0c;我们又陆续整理了很多大厂的面试题&#xff0c;帮助一些球友解惑答疑&#xff0c;分享技术面试中的那些弯弯绕绕。 今天…

【架构】Service Mesh

文章目录 概述微服务架构对比Rainbond与ServiceMesh来源 概述 Service Mesh 公认的定义&#xff0c;是用以处理服务与服务之间通信的专用基础设施层。更本质的理解&#xff0c;它是服务治理平台&#xff0c;是业务逻辑解耦的必然产物&#xff0c;是数字经济背景下企业对研发效…

基于flask和neo4j的医疗知识图谱展示问答系统

如果你仍在为毕业设计的选题发愁&#xff0c;或者想通过技术项目提升专业实力&#xff0c;这个基于Flask和Neo4j的医疗知识图谱展示与问答系统&#xff0c;绝对是个不错的选择&#xff01; 项目亮点大揭秘&#xff1a; 知识图谱与问答结合&#xff1a;我们采用了医疗场景下的知…

remote: HTTP Basic: Access denied

解决方法 输入&#xff1a; git config --system --unset credential.helper 再次进行 Git 操作&#xff0c;输入正确的用户名&#xff0c;密码即可。

STM32硬件平台

STM32 系列是 STMicroelectronics 设计的高度灵活、广泛应用的微控制器&#xff08;MCU&#xff09;系列&#xff0c;支持从低功耗应用到高性能处理的需求&#xff0c;适用于工业、汽车、消费电子和物联网等广泛领域。STM32 系列具有广泛的硬件种类和丰富的功能&#xff0c;以下…

OpenCV视觉分析之运动分析(5)背景减除类BackgroundSubtractorMOG2的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 基于高斯混合模型的背景/前景分割算法。 该类实现了在文献[320]和[319]中描述的高斯混合模型背景减除。 cv::BackgroundSubtractorMOG2 类是 O…

基于GPT的智能客服落地实践

&#x1f4cd;前言 在日常生活中&#xff0c;「客服」这个角色几乎贯穿着我们生活的方方面面。比如&#xff0c;淘宝买东西时&#xff0c;需要客服帮你解答疑惑。快递丢失时&#xff0c;需要客服帮忙找回。报名参加培训课程时&#xff0c;需要客服帮忙解答更适合的课程…… 基…

通过AWS Bedrock探索 Claude 的虚拟桌面魔力:让 AI 代替你动手完成任务!

前言 大家好&#xff0c;昨夜Anthropic 发布了更新。现在 Claude 3.5 Sonnet&#xff08;V2&#xff09; 和 Claude 3.5 Haiku&#xff0c;以及名为 computer use 的新功能已经作为公开测试版发布了。 Introducing computer use, a new Claude 3.5 Sonnet, and Claude 3.5 Ha…

【JavaEE】【多线程】线程池

目录 一、线程池二、ThreadPoolExecutor类讲解2.1 构造方法2.1.1 corePoolSize和maximumPoolSize2.1.2 KeepAliveTime和unit2.1.3 workeQueue2.1.4 threadFactory2.1.5 handler 三、简易构造线程池四、自己实现一个简单线程池 一、线程池 线程池&#xff1a;线程池可以简单理解…

DC-2靶机通关详解以及可能问题的解决

靶机下载地址&#xff1a;https://www.vulnhub.com/entry/dc-2,311/ 可能问题 出现如图的问题最大的可能是因为我们的VMware的版本过高&#xff0c;我们只需要降低一下版本就可以了。 找到虚拟机选项&#xff0c;点开其中的管理选项&#xff0c;然后选择更改兼容性。 直接下一…

双11买什么最划算?盘点双11必买好物合集

2024的“双11”购物狂欢节也是正式拉开帷幕&#xff0c;大家有没有物色到心仪的好物呢&#xff1f;每年的双11&#xff0c;都是数码家电爱好者的盛宴。在这个时候&#xff0c;各大品牌纷纷推出优惠活动&#xff0c;各种新品也层出不穷&#xff0c;正是入手这些商品的绝佳时机。…

SpringCloud Alibaba-03 Sentinel服务熔断与限流

与CircuitBreaker功能类似 后台默认8719端口 前台默认8080端口 在jar包所在目录下打开CMD&#xff0c;执行 java -jar sentinel-dashboard-1.8.6.jar 命令即可 网址http://localhost:8080 账号密码都是sentinel 1.Sentinel微服务8401纳入Sentinel监控 1.1 建Module&#…

javascript-基础 (三)

循环-for for 循环-基本使用 1. for循环语法 作用&#xff1a; 重复执行代码 好处&#xff1a; 把声明起始值、循环条件、变化值写到一起&#xff0c;让人一目了然 &#xff0c; 它是最常使用的循环形式 for (变量起始;终止条件;变量变化量) {//循环体 } 例子&#xff1a; f…

论文阅读(二十六):Dual Attention Network for Scene Segmentation

文章目录 1.Introduction3.DANet3.1Position Attention Module3.2Channel Attention Module 论文&#xff1a;Dual Attention Network for Scene Segmentation   论文链接&#xff1a;Dual Attention Network for Scene Segmentation   代码链接&#xff1a;Github 1.Intr…