ViewPager+Fragment实现懒加载(lazy-loading)
来源:互联网 发布:有什么软件可以赚钱 编辑:程序博客网 时间:2024/06/13 22:31
源码在GitHub上
什么是lazy-loading呢?顾名思义就是在必要的时候才加载,否则不进行View的绘制和数据的加载。原因是Viewpager一次只会显示一个页卡,那么刚开始的时候,只需加载第一张Fragment页卡,其他的不加载,当用户向右滑动切换再进行加载。因为其他Fragment对于用户来说是不可见的,如果一开始就把全部Fragment一起加载,可能造成启动时卡顿的问题,更重要的是可能白白耗费用户的流量,因为用户可能并不需要其他Fragment的信息。
1、首先创建一个BaseFragment
①、setUserVisibleHint查询当前fragment是否显示,用isVisible来标识
②、在onCreateView中Fragment是否创建,用isPrepared来标识
③、whetherLazzyLoad()方法中判断是否加载lazyLoad()方法,当isVisible和isPrepared都为true的时候才加载
④、 whetherLazzyLoad在onVisible()和onCreateView()方法中都需要调用,第一次创建Fragment(onCreateView)的时候需要调用whetherLazzLoad,每次切换(onVisible)再次调用whetherLazzLoad
/**
* ViewPager adapter中的每个fragment切换的时候都会被调用,如果是切换到当前页,那么isVisibleToUser==true,否则为false
*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
isVisible = true;
onVisible();
} else {
isVisible = false;
onInvisible();
}
}
* ViewPager adapter中的每个fragment切换的时候都会被调用,如果是切换到当前页,那么isVisibleToUser==true,否则为false
*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
isVisible = true;
onVisible();
} else {
isVisible = false;
onInvisible();
}
}
/**
* 可见
*/
protected void onVisible() {
whetherLazyLoad();
}
* 可见
*/
protected void onVisible() {
whetherLazyLoad();
}
/**
* 不可见
*/
protected void onInvisible() {
stopLoad();//停止耗时的操作
}
* 不可见
*/
protected void onInvisible() {
stopLoad();//停止耗时的操作
}
/**
* 延迟加载
* 子类必须重写此方法
*/
protected void whetherLazyLoad() {
if (!isVisible || !isPrepared) {
return;
}
lazyLoad();
}
* 延迟加载
* 子类必须重写此方法
*/
protected void whetherLazyLoad() {
if (!isVisible || !isPrepared) {
return;
}
lazyLoad();
}
onCreateView中将isPrepared设置为true,并调用whetherLazyLoad()方法
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(getLayoutId(), container, false);
mBind = ButterKnife.bind(this, view);
if (this instanceof BaseView) {
mPresenter = InstanceUtil.getInstance(this, 0);
mPresenter.setVM(this, InstanceUtil.getInstance(this, 1));
}
isPrepared = true;
whetherLazyLoad();
initView(view, savedInstanceState);
return view;
}
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(getLayoutId(), container, false);
mBind = ButterKnife.bind(this, view);
if (this instanceof BaseView) {
mPresenter = InstanceUtil.getInstance(this, 0);
mPresenter.setVM(this, InstanceUtil.getInstance(this, 1));
}
isPrepared = true;
whetherLazyLoad();
initView(view, savedInstanceState);
return view;
}
抽象方法,子类实现:
/**
* 懒加载,联网等操作
*/
protected abstract void lazyLoad();
/**
* 停止耗时的操作,计时器,动画等
*/
protected abstract void stopLoad();
* 懒加载,联网等操作
*/
protected abstract void lazyLoad();
/**
* 停止耗时的操作,计时器,动画等
*/
protected abstract void stopLoad();
阅读全文
1 0
- ViewPager+Fragment实现懒加载(lazy-loading)
- 实现类似微信Viewpager-Fragment的惰性加载,lazy-loading
- ViewPager实现Fragment懒加载
- viewpager fragment 实现懒加载
- ViewPager + Fragment实现懒加载
- ViewPager+Fragment实现懒加载
- ViewPager+Fragment实现懒加载
- lazy loading(延迟加载)
- 实现ViewPager+Fragment的懒加载功能
- ViewPager+Fragment 懒加载的实现
- Android之Viewpager+Fragment实现懒加载
- Fragment与Viewpager实现懒加载
- TabLayout+ViewPager+Fragment懒加载实现
- TabLayout+ViewPager+Fragment实现懒加载
- Android之Viewpager+Fragment实现懒加载
- Fragment+ViewPager实现真正的懒加载
- Android之ViewPager+Fragment实现懒加载
- TabLayout+ViewPager+fragment实现懒加载
- Android应用测试工具使用的一些心得记录
- LDD3源码分析之并发与竞态
- openstack-cloudinit
- Java语言中的枚举类型
- Kotlin初探
- ViewPager+Fragment实现懒加载(lazy-loading)
- python 和 matlab
- 学习 ui-router (一): 管理状态
- 局域网arpsniffer源码剖析
- entity、dto、vo理解
- 统计学生成绩,并存储到磁盘文件中
- 机器学习实战--kmeans实例讲解
- Android 启用线程的方法
- JWT介绍