转载请标明出处: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_HINTBEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT 。 默认情况下使用的是 BEHAVIOR_SET_USER_VISIBLE_HINT

从官方的注释声明中,我们能得到如下两条结论:

  • 如果 behavior 的值为 BEHAVIOR_SET_USER_VISIBLE_HINT,那么当 Fragment 对用户的可见状态发生改变时,setUserVisibleHint 方法会被调用。
  • 如果 behavior 的值为 BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT ,那么当前选中的 FragmentLifecycle.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 懒加载相关推荐

  1. viewpager+fragment 懒加载

    大家都知道viewpager默认会加载下一页数据,viewpager提供了一个方法setOffscreenPageLimit(),设置预加载页数 懒加载字面意思当需要的时候才去加载,不需要时不加载 之 ...

  2. ViewPager+Fragment懒加载

    原文链接:http://blog.csdn.net/linglongxin24/article/details/53205878 Android中ViewPager+Fragment取消(禁止)预加载 ...

  3. Fragment 懒加载

    为何懒加载 在很多 App 都会有ViewPage + Fragment 的基本组合,但是众所周知 viewPager 的 预加载机制,即使设置函数 setOffscreenPageLimit(0) ...

  4. 【Android】再来一篇Fragment懒加载(只加载一次哦)

    本篇文章已授权微信公众号 dasu_Android(大苏)独家发布 使用前需知 2017-7-14更新: 目前有人使用后出现了诸如首次打开显示空白界面,但点击有反应:或来回切换又变空白界面的问题.这些 ...

  5. Fragment懒加载(三)

    老实说,我没想到我会写关于Fragment懒加载的第三章内容,我之前是打算写两章就完结了,以我的知识储备,我就只认为懒加载只是为了配合viewpager防止预加载而已,然后我错了,我没想到Fragme ...

  6. 带你深入了解Fragment懒加载

    Fragment懒加载是一种优化技术,用于在Android应用中延迟加载和初始化Fragment的内容,以提高应用性能和用户体验.它的核心思想是只有在Fragment可见时才加载数据和执行相关操作,而 ...

  7. Android——Fragment懒加载

    Fragment懒加载 简述 LazyFragment 简述 大部分APP框架由一个单例MainActivity和多个Fragment组成:在实际开发中常使用BottomNavigationView+ ...

  8. Android androidx下的fragment懒加载

    androidx下的fragment中onHiddenChanged方法不会被调用,这就导致了懒加载实现方式要变更 前置条件: BottomNavigationView+ViewPager+fragm ...

  9. Fragment结合ViewPager之懒加载

    什么是懒加载?为什么要用懒加载?### 1.什么是懒加载 懒加载就是当ViewPager和Fragment结合在一起使用时,Fragment呈现在用户面前时才加载数据,当其从未被呈现在用户面前时,不会 ...

最新文章

  1. 深入分析Spark任务调度的原理--Java后端同学入门Spark编程系列
  2. 谷歌最新黑科技:裸眼3D视频通话,宛如真人面对面!Jeff Dean:魔镜啊魔镜
  3. Java开发软件安装及配置
  4. QT的QAxBase类的使用
  5. http post,get,put,delete区别(收集整理)
  6. 博客园能有这种背景就很强大了!
  7. Javascrip—前端本地存储讲解(16)
  8. “七层架构”-----实践篇-登录小实例
  9. 【转】带你玩转Visual Studio——01.开篇介绍
  10. abp执行mysql语句_在ABP模板工程中使用MySql
  11. 奔驰又召回了!“方便进出”功能翻车
  12. 30天敏捷结果(1):总体认识Getting Result敏捷方法
  13. 各个版本的sqlite-jdbc jar下载链接
  14. 软件工程师和程序员到底有多大的区别?
  15. 发音问题纠正:边音l和鼻音n,前鼻音与后鼻音的区别与发音
  16. iOS自定义相机(转)
  17. Udacity数据分析(入门)-探索美国共享单车数据
  18. 沙箱-简单实现支付宝网页支付功能
  19. 网站ssl证书出现错误如何解决
  20. html文件匹配歌手名和歌名,获取QQ音乐歌手姓名、歌曲信息、播放链接,爬,起,qq,名字...

热门文章

  1. anjuta 连接mysql_ubuntu系统下如何实现C/C++开发环境搭建(IDE)
  2. linux 增加lv大小,Linux增加LV(逻辑卷)容量
  3. mongodb php 安装配置,MongoDB 基本安装配置
  4. 程序员吐槽_男子吐槽:35岁被裁都是低端程序员,有能力只会是一个新台阶
  5. 第一行冻结_EXCEL函数tips(4) 数据冻结和查找
  6. 宋体字体是什么_Win10 系统替换 macOS 苹方字体 - 瞬间提升文字清晰
  7. NeurIPS 2020 | 一种基于动作采样的简单高效的正则化强化学习方法
  8. 从ICLR 2020、AAAI 2020看对话系统近期研究进展
  9. 一文读懂领域迁移与领域适应的常见方法
  10. 当Bert遇上Keras:这可能是Bert最简单的打开姿势