当前位置: 首页 > 编程笔记 >

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

公孙向荣
2023-03-14
本文向大家介绍详解Android 在 ViewPager 中使用 Fragment 的懒加载,包括了详解Android 在 ViewPager 中使用 Fragment 的懒加载的使用技巧和注意事项,需要的朋友参考一下

我们先看一下效果:

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

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

为什么要懒加载?

懒加载多被使用在新闻资讯类客户端中,试想那么多的分类如果一下子都加载出来,真的是极大地消耗了系统资源。可能有人会说 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() 方法进行数据的加载。

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

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

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

 类似资料:
  • 本文向大家介绍Android App在ViewPager中使用Fragment的实例讲解,包括了Android App在ViewPager中使用Fragment的实例讲解的使用技巧和注意事项,需要的朋友参考一下 据说Android最推荐的是在ViewPager中使用FragMent,即ViewPager中的页面不像前面那样用LayoutInflater直接从布局文件加载,而是一个个Fragment

  • 本文向大家介绍Android开发技巧之Fragment的懒加载,包括了Android开发技巧之Fragment的懒加载的使用技巧和注意事项,需要的朋友参考一下 前言 所谓懒加载,就是当fragment完全可见的时候我们再去加载数据,我们在做应用开发的时候,一个Activity里面可能会以viewpager(或其他容器)与多个Fragment来组合使用,而如果每个fragment都需要去加载数据,或

  • 本文向大家介绍图片懒加载imgLazyLoading.js使用详解,包括了图片懒加载imgLazyLoading.js使用详解的使用技巧和注意事项,需要的朋友参考一下 本文主要介绍web前端使用图片懒加载imgLazyLoading ,供大家参考,具体内容如下 1、html代码 2、js代码 imgLazyLoading.min.js imgLazyLoading.js 以上就是本文的全部内容,希

  • 本文向大家介绍android实现ViewPager懒加载的三种方法,包括了android实现ViewPager懒加载的三种方法的使用技巧和注意事项,需要的朋友参考一下 在项目中ViewPager和Fragment接口框架已经是处处可见,但是在使用中,我们肯定不希望用户在当前页面时就在前后页面的数据,加入数据量很大,而用户又不愿意左右滑动浏览,那么这时候ViewPager中本来充满善意的预加载就有点

  • 本文向大家介绍Android 中Fragment与Activity通讯的详解,包括了Android 中Fragment与Activity通讯的详解的使用技巧和注意事项,需要的朋友参考一下 Android 中Fragment与Activity通讯的详解 与activity通讯 尽管fragment的实现是独立于activity的,可以被用于多个activity,但是每个activity所包含的是同一

  • 本文向大家介绍详解Android studio 动态fragment的用法,包括了详解Android studio 动态fragment的用法的使用技巧和注意事项,需要的朋友参考一下 fragment的使用时Android的基础,它有两种用法,第一个就是静态的fragment。第二个则是动态的fragment。 静态fragment直接在layout创建你想要的fragment的XML的文件,然后

  • 本文向大家介绍Android中ViewPager获取当前显示的Fragment,包括了Android中ViewPager获取当前显示的Fragment的使用技巧和注意事项,需要的朋友参考一下 前言 在项目中,有时会用到在ViewPager中显示同样类型的Fragment,同时这样的Fragment的个数是动态的,但是PagerAdapter没有给我们提供getCurrentFragment类似的方