详解Android 在 ViewPager 中使用 Fragment 的懒加载

发布时间 - 2026-01-11 02:07:07    点击率:

我们先看一下效果:

首先,我们要知道什么是懒加载:

懒加载,就是先初始化控件,在用户可见的时候再加载数据。

为什么要懒加载?

懒加载多被使用在新闻资讯类客户端中,试想那么多的分类如果一下子都加载出来,真的是极大地消耗了系统资源。可能有人会说 ViewPager 有 viewPager.setOffscreenPageLimit() 的方法,我们传个 0 进去不就好了吗?看过源码的应该知道,即便你传了 0 进去,系统也会默认为 1 的,也就是 ViewPager 依然会加载当前页面的前后各一个 Fragment 。

我们首先为需要进行懒加载的 Fragment 写一个基类:

public abstract class LazyFragment extends Fragment {

  // 控件是否初始化完成
  // 我们在控件初始化完成之后再进行数据的加载,否则对控件进行操作的时候会遇到空指针异常
  protected boolean isViewCreated;

  // 是否加载过数据
  // 我们判断未曾加载过数据的话再进行获取,否则每次对用户可见时都会执行懒加载的方法
  protected boolean isLoadCompleted;

  // 该方法只有在ViewPager与Fragment结合使用的时候才会执行
  // 该方法在onCreateView之前调用
  @Override
  public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser && isViewCreated && !isLoadCompleted) {
      // 只有在对用户可见、控件初始化完成并且未曾加载过数据的情况下才进行懒加载
      lazyLoad();
      isLoadCompleted = true;
    }
  }

  // ViewPager的第一个Fragment默认执行setUserVisibleHint(fasle)方法
  // 所以在activity创建完成后要让第一页也加载数据
  @Override
  public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    if (getUserVisibleHint()) {
      // 此处不需要判断isViewCreated,因为这个方法在onCreateView方法之后执行
      lazyLoad();
      isLoadCompleted = true;
    }
  }

  // 懒加载,强制子类重写
  protected abstract void lazyLoad();

}

注释已经写的很详细了,接下来是子类的实现:

public class NewsFragment extends LazyFragment {

  @Nullable
  @Override
  public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.frag_news, null);
    initView(view); // 进行控件的初始化
    isViewCreated = true; // 控件初始化完成
    return view;
  }

  @Override
  protected void lazyLoad() {
    // 加载数据
  }

}

这样 Fragment 的懒加载基本算是完成了。还有一点需要注意的是别忘记了写:

 //// 这行代码一定要写,否则会出现奇葩问题
 viewPager.setOffscreenPageLimit(fragments.size());

我这里是在 Activity 启动的时候初始化所有的 Fragment,打印日志会发现每个 Fragemnt 的 onCreateView() 都执行了,也就是说控件全部初始化完毕,之后滑动对用户可见的时候执行 setUserVisibleHint() 方法进行数据的加载。

网上有很多关于懒加载的文章,也有多种的写法。写一个适合自己的,才是最好的。

->->->点击下载源码<-<-<-

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# fragment的懒加载  # fragment懒加载  # fragment懒加载数据  # androidx下的fragment的lazy懒加载问题详解  # Android 多层嵌套后的 Fragment 懒加载实现示例  # Android优化方案之Fragment的懒加载实现代码  # Android仿今日头条多个fragment懒加载的实现  # Android之Viewpager+Fragment实现懒加载示例  # Android开发技巧之Fragment的懒加载  # Android开发之Fragment懒加载的几种方式及性能对比  # 加载  # 的是  # 子类  # 自己的  # 是在  # 也有  # 好了  # 也会  # 第一个  # 最好的  # 才是  # 不需要  # 有很多  # 才会  # 那么多  # 不就  # 要知道  # 重写  # 要让  # 会说 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在景安云服务器上绑定域名并配置虚拟主机?  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南  如何构建满足综合性能需求的优质建站方案?  Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道  Laravel如何实现用户注册和登录?(Auth脚手架指南)  网站制作免费,什么网站能看正片电影?  如何快速查询网站的真实建站时间?  网站制作软件免费下载安装,有哪些免费下载的软件网站?  Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  Python自动化办公教程_ExcelWordPDF批量处理案例  java中使用zxing批量生成二维码立牌  如何实现建站之星域名转发设置?  海南网站制作公司有哪些,海口网是哪家的?  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  js代码实现下拉菜单【推荐】  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  Laravel怎么使用Intervention Image库处理图片上传和缩放  EditPlus中的正则表达式 实战(1)  晋江文学城电脑版官网 晋江文学城网页版直接进入  详解Android中Activity的四大启动模式实验简述  Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制  如何在IIS中配置站点IP、端口及主机头?  JavaScript模板引擎Template.js使用详解  Linux后台任务运行方法_nohup与&使用技巧【技巧】  做企业网站制作流程,企业网站制作基本流程有哪些?  Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】  如何快速生成可下载的建站源码工具?  Laravel集合Collection怎么用_Laravel集合常用函数详解  python中快速进行多个字符替换的方法小结  Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案  网站建设要注意的标准 促进网站用户好感度!  实例解析Array和String方法  香港服务器建站指南:免备案优势与SEO优化技巧全解析  Laravel PHP版本要求一览_Laravel各版本环境要求对照  javascript基于原型链的继承及call和apply函数用法分析  如何在IIS管理器中快速创建并配置网站?  如何快速搭建支持数据库操作的智能建站平台?  ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集  html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】  laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法  如何基于云服务器快速搭建网站及云盘系统?  Laravel如何处理异常和错误?(Handler示例)  Python文件流缓冲机制_IO性能解析【教程】  如何在Windows环境下新建FTP站点并设置权限?  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  简单实现jsp分页  Laravel Fortify是什么,和Jetstream有什么关系  Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】