Android ViewPager2 setOffscreenPageLimit预加载Fragment,Kotlin

Android ViewPager2 setOffscreenPageLimit预加载Fragment,Kotlin

import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import androidx.viewpager2.adapter.FragmentStateAdapter
import androidx.viewpager2.widget.ViewPager2


class MainActivity : AppCompatActivity() {
    companion object {
        const val TAG = "fly"
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val mViewPager2 = findViewById<ViewPager2>(R.id.vp2)
        mViewPager2.adapter = MyPageAdapter(this)
    }

    class MyPageAdapter : FragmentStateAdapter {
        private var mFragments = arrayListOf<MyFragment>()

        constructor(activity: FragmentActivity) : super(activity) {
            for (i in 0 until 5) {
                mFragments.add(MyFragment(i))
            }
        }

        override fun getItemCount(): Int {
            return mFragments.size
        }

        override fun createFragment(position: Int): Fragment {
            return mFragments[position]
        }
    }

    class MyFragment : Fragment {
        private var seq = 0

        constructor(seq: Int) {
            this.seq = seq
            Log.d(TAG, "$seq constructor")
        }

        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            Log.d(TAG, "$seq onCreate")
        }

        override fun onResume() {
            super.onResume()
            Log.d(TAG, "$seq onResume")
        }

        override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
            return inflater.inflate(android.R.layout.simple_list_item_1, container, false)
        }

        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            val tv = view.findViewById<TextView>(android.R.id.text1)
            tv.text = "$seq"
            tv.textSize = 50f
            Log.d(TAG, "$seq onViewCreated")
        }

        override fun onPause() {
            super.onPause()
            Log.d(TAG, "$seq onPause")
        }

        override fun onDestroy() {
            super.onDestroy()
            Log.d(TAG, "$seq onDestroy")
        }

        override fun onDestroyView() {
            super.onDestroyView()
            Log.d(TAG, "$seq onDestroyView")
        }
    }
}

ViewPager2与ViewPager不同,默认情况下,由于ViewPager2内部源代码中mOffscreenPageLimit默认等于-1:

    public static final int OFFSCREEN_PAGE_LIMIT_DEFAULT = -1;

所以,当ViewPager2装载好Fragment启动后,只会显示当前可见的那1个Fragment,而不像过去的ViewPager那样,把后面不可见的Fragment也加载出来:

0 constructor
1 constructor
2 constructor
3 constructor
4 constructor
0 onCreate
0 onViewCreated
0 onResume

日志显示,只加载了当前可见的0号Fragment,没有加载1号Fragment。

此时,往左滑,使得1号Fragment显示在屏幕:

1 onCreate
1 onViewCreated
0 onPause
1 onResume

Fragment 1此时才创建,没有加载不可见的2号Fragment。

简单的说,这就是过去VIewPager时代,想要实现的“懒加载”模式:让ViewPager只加载当前可见的那个Fragment。而在ViewPager2中,默认情况不设置

mOffscreenPageLimit

时候,ViewPager2就是懒加载模式的ViewPager标准实现,只会加载当前显示的那1个Fragment,不会加载后面不可见的Fragment。


如果,设置了mOffscreenPageLimit呢?给mOffscreenPageLimit设置0或者-1?看看ViewPager2中的setOffscreenPageLimit()源代码:

    public void setOffscreenPageLimit(@OffscreenPageLimit int limit) {
        if (limit < 1 && limit != OFFSCREEN_PAGE_LIMIT_DEFAULT) {
            throw new IllegalArgumentException(
                    "Offscreen page limit must be OFFSCREEN_PAGE_LIMIT_DEFAULT or a number > 0");
        }
        mOffscreenPageLimit = limit;
        // Trigger layout so prefetch happens through getExtraLayoutSize()
        mRecyclerView.requestLayout();
    }

已知的是OFFSCREEN_PAGE_LIMIT_DEFAULT=-1。从源代码可以看到,ViewPager2的setOffscreenPageLimit()只接受 >= 1的值,看来不能给mOffscreenPageLimit设置0或者-1。

现在给ViewPager2的设置1:

mViewPager2.offscreenPageLimit = 1

重新编译,看看启动后装载Fragment的表现:

0 constructor
1 constructor
2 constructor
3 constructor
4 constructor
0 onCreate
0 onViewCreated
0 onResume
1 onCreate
1 onViewCreated

除了加载当前可见的0号Fragment外,ViewPager2也把不可见的、后面1号Fragment顺带加载出来了,这和过去老版ViewPager相同。

往左滑一个页面,把1号Fragment显示出来当前可见:

2 onCreate
2 onViewCreated
0 onPause
1 onResume

调用了1号Fragment的onResume周期方法,并把不可见的2号Fragment创建出来。

如果offscreenPageLimit 是2:

mViewPager2.offscreenPageLimit = 2

编译重新启动后:

0 constructor
1 constructor
2 constructor
3 constructor
4 constructor
0 onCreate
0 onViewCreated
0 onResume
1 onCreate
1 onViewCreated
2 onCreate
2 onViewCreated

除了把当前可见的0号Fragment加载出来外,还把不可见的1号和2号Fragment也加载出来了。


总结:

1、ViewPager2默认不设置mOffscreenPageLimit情况下,就是过去老版ViewPager想要达到的“懒加载”“延迟加载”模式,即,只加载当前可见的那1个Fragment。

2、如果设置了mOffscreenPageLimit(并且,mOffscreenPageLimit通过setOffscreenPageLimit()这个API接口也只能设置  >=1 的值),ViewPager2就退化成过去老版的ViewPager了,除了把当前可见的那个Fragment加载出来外,还会根据用户设置的mOffscreenPageLimit值,加载mOffscreenPageLimit个不可见的Fragment。即一次性总共加载 1 + mOffscreenPageLimit 个Fragment。1是当前屏幕显示的那1个Fragment;mOffscreenPageLimit是后面不可见的Fragment。

ViewPager2和Fragment可见性及懒加载解决方案_viewpage2和fragment 当前页面可见接受消息-CSDN博客文章浏览阅读6.5k次,点赞5次,收藏14次。ViewPager2和Fragment新的可见性及懒加载解决方案,旨在解决ViewPager(ViewPager2)只有当前Fragment唯一可见时候网络刷新或绘图。注意:过去的setUserVisibleHint()已被废弃,开发者不要再使用基于setUserVisibleHint()解决Fragment可见性和懒加载(或延迟加载)的场景。新方案用最新的ViewPager2替代过去旧版的ViewPager,再结合Fragment的resume和pause生命周期实现。写一个demo例子,测试的主类M_viewpage2和fragment 当前页面可见接受消息https://blog.csdn.net/zhangphil/article/details/108893237Android ViewPager2 load once when fast scroll many page,Java-CSDN博客文章浏览阅读206次。ViewPager2和Fragment新的可见性及懒加载解决方案,旨在解决ViewPager(ViewPager2)只有当前Fragment唯一可见时候网络刷新或绘图。注意:过去的setUserVisibleHint()已被废弃,开发者不要再使用基于setUserVisibleHint()解决Fragment可见性和懒加载(或延迟加载)的场景。新方案用最新的ViewPager2替代过去旧版的ViewPager,再结合Fragment的resume和pause生命周期实现。写一个demo例子,测试的主类M。https://blog.csdn.net/zhangphil/article/details/129885331Android ViewPager2嵌套RecyclerView性能优化RecycledViewPool,kotlin-CSDN博客文章浏览阅读750次。ViewPager2和Fragment新的可见性及懒加载解决方案,旨在解决ViewPager(ViewPager2)只有当前Fragment唯一可见时候网络刷新或绘图。注意:过去的setUserVisibleHint()已被废弃,开发者不要再使用基于setUserVisibleHint()解决Fragment可见性和懒加载(或延迟加载)的场景。ViewPager2和Fragment可见性及懒加载解决方案_viewpager2 懒加载_zhangphil的博客-CSDN博客。_viewpager2嵌套recyclerviewhttps://blog.csdn.net/zhangphil/article/details/131231747

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

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

相关文章

社交革命:Facebook如何塑造数字社交的未来

引言 在当今数字化时代&#xff0c;社交媒体已成为人们生活的核心&#xff0c;而Facebook作为其中的领军者&#xff0c;一直在塑造着数字社交的未来。本文将深入探讨Facebook在数字社交领域的地位、影响力以及对未来社交的塑造作用&#xff0c;为读者揭示这场社交革命如何由Fa…

华为开源自研AI框架昇思MindSpore应用案例:梯度累加

目录 一、环境准备1.进入ModelArts官网2.使用CodeLab体验Notebook实例 二、案例实现 梯度累加的训练算法&#xff0c;目的是为了解决由于内存不足&#xff0c;导致Batch size过大神经网络无法训练&#xff0c;或者网络模型过大无法加载的OOM&#xff08;Out Of Memory&#xff…

华为实验-基于用户和应用的安全策略

CLI举例&#xff1a;基于用户和应用的安全策略 通过配置安全策略&#xff0c;实现基于用户、时间段以及应用的访问控制。 组网需求 如图1所示&#xff0c;某企业在网络边界处部署了FW作为安全网关。 企业根据员工级别和职能不同划分了三种用户&#xff1a;高层管理者、市场员…

OSG编程指南<二十一>:OSG视图与相机视点更新设置及OSG宽屏变形

1、概述 什么是视图?在《OpenGL 编程指南》中有下面的比喻,从笔者开始学习图形学就影响深刻,相信对读者学习场景管理也会非常有帮助。 产生目标场景视图的变换过程类似于用相机进行拍照,主要有如下的步骤: (1)把照相机固定在三脚架上,让它对准场景(视图变换)。 (2)…

The Annotated Transformer 阅读学习

查资料的间隙发现一篇介绍Transformer的文章&#xff0c;觉得写得很好&#xff0c;但是时间有限一时半会没办法深入去读这里就做了简单的阅读记录&#xff0c;英语水平有限这里只好借助于机器翻译的帮助&#xff0c;将阅读的内容记录下来&#xff0c;等后续有时间再来回顾。 原…

前端-html-02

1.列表 标签名功能和语义属性单标签还是双标签ul无序列表包裹元素双标签 ol 有序列表包裹元素双标签li列表项双标签dl定义列表包裹元素双标签dt定义列表项标题双标签dd定义列表项描述双标签 li必须由Ul或者ol包裹 <!DOCTYPE html> <html><head><…

Linux(CentOS)/Windows-C++ 云备份项目(服务器网络通信模块,业务处理模块设计,断点续传设计)

此模块将网络通信模块和业务处理模块进行了合并 网络通信通过httplib库搭建完成业务处理&#xff1a; 文件上传请求&#xff1a;备份客户端上传的文件&#xff0c;响应上传成功客户端列表请求&#xff1a;客户端请求备份文件的请求页面&#xff0c;服务器响应文件下载请求&…

vector类(一)

文章目录 vector介绍和使用1.vector的介绍2.vector的使用2.1 vector的定义2.2 vector iterator的使用2.3 vector空间增长问题2.4 vector增删查改2.5 vector迭代器失效问题 3.vector 在OJ中的使用 vector介绍和使用 1.vector的介绍 vector是表示 可变大小数组的 序列容器。 就…

【jmeter+ant+jenkins】之搭建 接口自动化测试平台

平台搭建 (1). 录制jmeter脚本 (2). 将jmeter的安装目录下的G:\jmeter\apache-jmeter-5.1.1\extras中&#xff0c;将 ”ant-jmeter-1.1.1.jar”文件放到 ant的lib目录下 (3). 配置jmeter的xml配置文件&#xff0c;并放在ant目录的bin目录下&#xff0c;使用ant编译验证jmeter的…

【书生·浦语大模型实战营第二期】学习笔记1

1. Introduction 开源llm举例&#xff1a;LLaMA 、Qwen 、Mistral 和Deepseek 大型语言模型的发展包括预训练、监督微调&#xff08;SFT&#xff09;和基于人类反馈的强化学习&#xff08;RLHF&#xff09;等主要阶段 InternLM2的显著特点 采用分组查询注意力&#xff08;GQA…

2014年认证杯SPSSPRO杯数学建模C题(第一阶段)土地储备方案的风险评估全过程文档及程序

2014年认证杯SPSSPRO杯数学建模 C题 土地储备方案的风险评估 原题再现&#xff1a; 土地储备&#xff0c;是指市、县人民政府国土资源管理部门为实现调控土地市场、促进土地资源合理利用目标&#xff0c;依法取得土地&#xff0c;进行前期开发、储存以备供应土地的行为。土地…

保姆级指导0基础如何快速搭建“对话机器人”类ChatGPT

参考了CDSN上的文章&#xff0c;但发现不work&#xff0c; 不是这里有问题&#xff0c;就是那里有问题&#xff0c;查阅了大量的资料&#xff0c;做了无数次试验&#xff0c;终于整理出来了一个完整的教程&#xff0c;保可用&#xff0c;保真~~~~~如果各位遇到什么问题&#xf…

【Leetcode每日一题】 递归 - 计算布尔二叉树的值(难度⭐⭐)(44)

1. 题目解析 题目链接&#xff1a;2331. 计算布尔二叉树的值 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 算法思路概述&#xff1a; 问题解释&#xff1a;我们面对的是一个节点可能含有逻辑运算符&#xff08;AN…

探索智慧农业精准除草,基于高精度YOLOv8全系列参数【n/s/m/l/x】模型开发构建农田作物场景下杂草作物分割检测识别分析系统

智慧农业是未来的一个新兴赛道&#xff0c;随着科技的普及与落地应用&#xff0c;会有更加广阔的发展空间&#xff0c;关于农田作物场景下的项目开发实践&#xff0c;在我们前面的博文中也有很堵相关的实践&#xff0c;单大都是偏向于目标检测方向的&#xff0c;感兴趣可以自行…

opencv如何利用掩码将两张图合成一张图

最近在学opencv, 初学者。 里面有提到如何将两张图合成一张图, 提供了两个方法 一种是直接通过图片透明度权重进行融合 img1 = cv.imread(ml.png) img2 = cv.imread(opencv-logo.png) dst = cv.addWeighted(img1,0.7,img2,0.3,0) cv.imshow(dst,dst) cv.waitKey(0) cv.des…

6.二叉树——2.重建树

已知先序和中序序列 根据先序序列找到树根根据树根和中序序列找到左右子树 同理根据后序序列和中序序列也能重构树&#xff0c;但前序和后序不可以 递归coding思路 设先序序列为preorder[n]&#xff0c;中序序列为midorder[n] 大事化小&#xff1a; 确定根&#xff0c;即树…

Chrome 插件 storage API 解析

Chrome.storage API 解析 使用 chrome.storage API 存储、检索和跟踪用户数据的更改 一、各模块中的 chrome.storage 内容 1. Service worker 中 runtime 内容 2. Action 中 runtime 内容 3. Content 中 runtime 内容 二、权限&#xff08;Permissions&#xff09; 如果需使…

Ubuntu 配置 kubernetes 学习环境,让外部访问 dashboard

Ubuntu 配置 kubernetes 学习环境 一、安装 1. minikube 首先下载一下 minikube&#xff0c;这是一个单机版的 k8s&#xff0c;只需要有容器环境就可以轻松启动和学习 k8s。 首先你需要有Docker、QEMU、Hyperkit等其中之一的容器环境&#xff0c;以下使用 docker 进行。 对…

CleanMyMac X2024专业免费的国产Mac笔记本清理软件

非常高兴有机会向大家介绍CleanMyMac X 2024这款专业的Mac清理软件。它以其强大的清理能力、系统优化效果、出色的用户体验以及高度的安全性&#xff0c;在Mac清理软件市场中独树一帜。 CleanMyMac X2024全新版下载如下: https://wm.makeding.com/iclk/?zoneid49983 一、主要…

Nuxt2 渲染时html比css加载快,导致闪屏/CSS样式迟滞/抖动问题记录

问题场景&#xff1a; 最近在用Nuxt2重写公司官网&#xff0c;但因为笔者不是专业前端&#xff0c;之前虽然也用vue2来写前端&#xff0c;但是用nuxt2来写项目还是第一次。在开发过程中虽然也磕磕碰碰&#xff0c;但因为开发的是官网&#xff0c;偏CMS型的网站&#xff0c;所以…