详解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将图片转换存到数据库再从数据库读取转换成图片实现代码
有时候我们想把图片存入到数据库中,尽管这不是一种明智的选择,但有时候还是不得以会用到,下面说说将图片转换成byte[]数组存入到数据库中去,并从数据库中取出来转换成图像显示出来2013-11-11
Android之RecyclerView轻松实现下拉刷新和加载更多示例
本篇文章主要介绍了Android之RecyclerView轻松实现下拉刷新和加载更多示例,非常具有实用价值,需要的朋友可以参考下。2017-02-02
基于Android SDK-在64位Linux中使用需要注意的问题
本篇文章是对Android SDK-在64位Linux中使用需要注意的问题进行了详细的分析介绍,需要的朋友参考下2013-05-05
Android开发之InetAddress基础入门简介与源码实例
这篇文章主要介绍了Android开发之InetAddress基础入门简介,需要的朋友可以参考下2020-03-03
Android序列化接口Parcelable与Serializable接口对比
我们使用 Intent 传递数据的时候,putExtra() 所支持的数据类型事有限的,当需要传递自定义对象的时候就需要序列化。Serializable更简单但是会把整个对象进行序列化因此效率比Parcelable低一些2023-02-02


最新评论