Androidx ViewPager+Fragment 懒加载
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/113545036
本文出自【赵彦军的博客】
目录
- 前言
- 懒加载(预加载)
- 传统模式
- Androidx
- 总结
前言
还有一个月就过年了,超级开心。
本文所有内容已经上传至github:https://github.com/zyj1609wz/ViewPagerLazyLoad
懒加载(预加载)
懒加载字面意思就是当需要的时候才会去加载,不需要就不要加载。
以前处理 Fragment 的懒加载,我们通常会在 Fragment 中处理 setUserVisibleHint + onHiddenChanged
这两个函数,而在 Androidx
模式下,我们可以使用 FragmentTransaction.setMaxLifecycle()
的方式来处理 Fragment
的懒加载。
fragment 生命周期:
onAttach
-> onCreate
-> onCreateView
-> onViewCreated
-> onActivityCreated
-> onStart
-> onResume
一般在 onCreate
方法中接收 bundle
中的数据,在 onCreateView
创建 view
初始化 布局。在 onActivityCreated
或者 onResume
做懒加载
传统模式
package com.zhaoyanjun.mode1import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroupabstract class BaseFragment : Fragment() {/*** 用户是否可见*/protected var mIsVisibleToUser = false/*** view是否创建*/protected var mIsViewCreated = false/*** 是否是第一次加载*/protected var mIsFirstLoad = falseoverride fun onActivityCreated(savedInstanceState: Bundle?) {super.onActivityCreated(savedInstanceState)mIsViewCreated = trueif (mIsVisibleToUser) {firstLoad()}}/*** 懒加载模式下生效*/fun firstLoad() {if (mIsFirstLoad) {return}mIsFirstLoad = trueonFirstLoad()}/*** 懒加载的时候调用*/open fun onFirstLoad() {}override fun setUserVisibleHint(isVisibleToUser: Boolean) {super.setUserVisibleHint(isVisibleToUser)mIsVisibleToUser = isVisibleToUserif (mIsVisibleToUser && mIsViewCreated) {firstLoad()}}override fun onDestroyView() {mIsVisibleToUser = falsemIsViewCreated = falsemIsFirstLoad = falsesuper.onDestroyView()}
}
使用 :
package com.zhaoyanjun.mode1import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import com.zhaoyanjun.Rclass ContentFragment : BaseFragment() {private var param1: String? = nullprivate var rootView: View? = nullprivate var nameTv: TextView? = nulloverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)arguments?.let {param1 = it.getString(ARG_PARAM1)}}override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle?): View? {rootView = inflater.inflate(R.layout.fragment_content, container, false)nameTv = rootView?.findViewById(R.id.name)return rootView}//懒加载更新数据override fun onFirstLoad() {super.onFirstLoad()//第一次加载Log.d("zhaoyanjun-", "firstLoad index: $param1")nameTv?.text = param1}companion object {private const val ARG_PARAM1 = "param1"@JvmStaticfun newInstance(param1: String) =ContentFragment().apply {arguments = Bundle().apply {putString(ARG_PARAM1, param1)}}}
}
Androidx
在使用 Androidx 的时候,会发现 FragmentPagerAdapter(fragmentManager) 方法过时了
取而代之的是 两个参数的构造函数 。
public FragmentPagerAdapter(@NonNull FragmentManager fm,@Behavior int behavior) {mFragmentManager = fm;mBehavior = behavior;
}
mBehavior 有两个值:BEHAVIOR_SET_USER_VISIBLE_HINT
、BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT
。 默认情况下使用的是 BEHAVIOR_SET_USER_VISIBLE_HINT
从官方的注释声明中,我们能得到如下两条结论:
- 如果 behavior 的值为
BEHAVIOR_SET_USER_VISIBLE_HINT
,那么当 Fragment 对用户的可见状态发生改变时,setUserVisibleHint
方法会被调用。 - 如果 behavior 的值为
BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT
,那么当前选中的Fragment
在Lifecycle.State#RESUMED
状态 ,其他不可见的Fragment
会被限制在Lifecycle.State#STARTED
状态。
所以我的的懒加载方案就呼之欲出了:
package com.zhaoyanjun.mode2import androidx.fragment.app.Fragmentabstract class BaseFragment2 : Fragment() {private var isLoaded = falseoverride fun onResume() {super.onResume()//增加了Fragment是否可见的判断if (!isLoaded && !isHidden) {isLoaded = trueonFirstLoad()}}override fun onDestroyView() {super.onDestroyView()isLoaded = false}open fun onFirstLoad() {}
}
使用:
class ContentFragment2 : BaseFragment2() {private var param1: String? = nullprivate var rootView: View? = nullprivate var nameTv: TextView? = nulloverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)arguments?.let {param1 = it.getString(ARG_PARAM1)}}override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle?): View? {rootView = inflater.inflate(R.layout.fragment_content, container, false)nameTv = rootView?.findViewById(R.id.name)return rootView}override fun onFirstLoad() {super.onFirstLoad()//第一次加载Log.d("zhaoyanjun-mode2 ", "firstLoad index: $param1")nameTv?.text = param1}companion object {private const val ARG_PARAM1 = "param1"@JvmStaticfun newInstance(param1: String) =ContentFragment2().apply {arguments = Bundle().apply {putString(ARG_PARAM1, param1)}}}
总结
本文代码已上传至:https://github.com/zyj1609wz/ViewPagerLazyLoad
Androidx ViewPager+Fragment 懒加载相关推荐
- viewpager+fragment 懒加载
大家都知道viewpager默认会加载下一页数据,viewpager提供了一个方法setOffscreenPageLimit(),设置预加载页数 懒加载字面意思当需要的时候才去加载,不需要时不加载 之 ...
- ViewPager+Fragment懒加载
原文链接:http://blog.csdn.net/linglongxin24/article/details/53205878 Android中ViewPager+Fragment取消(禁止)预加载 ...
- Fragment 懒加载
为何懒加载 在很多 App 都会有ViewPage + Fragment 的基本组合,但是众所周知 viewPager 的 预加载机制,即使设置函数 setOffscreenPageLimit(0) ...
- 【Android】再来一篇Fragment懒加载(只加载一次哦)
本篇文章已授权微信公众号 dasu_Android(大苏)独家发布 使用前需知 2017-7-14更新: 目前有人使用后出现了诸如首次打开显示空白界面,但点击有反应:或来回切换又变空白界面的问题.这些 ...
- Fragment懒加载(三)
老实说,我没想到我会写关于Fragment懒加载的第三章内容,我之前是打算写两章就完结了,以我的知识储备,我就只认为懒加载只是为了配合viewpager防止预加载而已,然后我错了,我没想到Fragme ...
- 带你深入了解Fragment懒加载
Fragment懒加载是一种优化技术,用于在Android应用中延迟加载和初始化Fragment的内容,以提高应用性能和用户体验.它的核心思想是只有在Fragment可见时才加载数据和执行相关操作,而 ...
- Android——Fragment懒加载
Fragment懒加载 简述 LazyFragment 简述 大部分APP框架由一个单例MainActivity和多个Fragment组成:在实际开发中常使用BottomNavigationView+ ...
- Android androidx下的fragment懒加载
androidx下的fragment中onHiddenChanged方法不会被调用,这就导致了懒加载实现方式要变更 前置条件: BottomNavigationView+ViewPager+fragm ...
- Fragment结合ViewPager之懒加载
什么是懒加载?为什么要用懒加载?### 1.什么是懒加载 懒加载就是当ViewPager和Fragment结合在一起使用时,Fragment呈现在用户面前时才加载数据,当其从未被呈现在用户面前时,不会 ...
最新文章
- 深入分析Spark任务调度的原理--Java后端同学入门Spark编程系列
- 谷歌最新黑科技:裸眼3D视频通话,宛如真人面对面!Jeff Dean:魔镜啊魔镜
- Java开发软件安装及配置
- QT的QAxBase类的使用
- http post,get,put,delete区别(收集整理)
- 博客园能有这种背景就很强大了!
- Javascrip—前端本地存储讲解(16)
- “七层架构”-----实践篇-登录小实例
- 【转】带你玩转Visual Studio——01.开篇介绍
- abp执行mysql语句_在ABP模板工程中使用MySql
- 奔驰又召回了!“方便进出”功能翻车
- 30天敏捷结果(1):总体认识Getting Result敏捷方法
- 各个版本的sqlite-jdbc jar下载链接
- 软件工程师和程序员到底有多大的区别?
- 发音问题纠正:边音l和鼻音n,前鼻音与后鼻音的区别与发音
- iOS自定义相机(转)
- Udacity数据分析(入门)-探索美国共享单车数据
- 沙箱-简单实现支付宝网页支付功能
- 网站ssl证书出现错误如何解决
- html文件匹配歌手名和歌名,获取QQ音乐歌手姓名、歌曲信息、播放链接,爬,起,qq,名字...
热门文章
- anjuta 连接mysql_ubuntu系统下如何实现C/C++开发环境搭建(IDE)
- linux 增加lv大小,Linux增加LV(逻辑卷)容量
- mongodb php 安装配置,MongoDB 基本安装配置
- 程序员吐槽_男子吐槽:35岁被裁都是低端程序员,有能力只会是一个新台阶
- 第一行冻结_EXCEL函数tips(4) 数据冻结和查找
- 宋体字体是什么_Win10 系统替换 macOS 苹方字体 - 瞬间提升文字清晰
- NeurIPS 2020 | 一种基于动作采样的简单高效的正则化强化学习方法
- 从ICLR 2020、AAAI 2020看对话系统近期研究进展
- 一文读懂领域迁移与领域适应的常见方法
- 当Bert遇上Keras:这可能是Bert最简单的打开姿势