详解Android 在 ViewPager 中使用 Fragment 的懒加载
程序员文章站
2022-06-04 21:41:27
我们先看一下效果:
首先,我们要知道什么是懒加载:
懒加载,就是先初始化控件,在用户可见的时候再加载数据。
为什么要懒加载?
懒加载多被使用在新闻资讯类客户端中...
我们先看一下效果:
首先,我们要知道什么是懒加载:
懒加载,就是先初始化控件,在用户可见的时候再加载数据。
为什么要懒加载?
懒加载多被使用在新闻资讯类客户端中,试想那么多的分类如果一下子都加载出来,真的是极大地消耗了系统资源。可能有人会说 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开发中尽量不要使用中文路径的问题详解
-
详解Android 在 ViewPager 中使用 Fragment 的懒加载
-
Android中Fragment的加载方式与数据通信详解
-
Android开发中如何解决Fragment +Viewpager滑动页面重复加载的问题
-
Android在fragment中编写toobar的步骤详解
-
详解Android 在 ViewPager 中使用 Fragment 的懒加载
-
Android基础常用组件——Fragment的创建,生命周期,与Activity通信,结合ViewPager使用的预加载和懒加载
-
Android开发中如何解决Fragment +Viewpager滑动页面重复加载的问题
-
Android在fragment中编写toobar的步骤详解