ViewPager懒加载的简单实现

常用ViewPager的开发者一定知道,谷歌为了增强用户体验,ViewPager加载页面时默认会预加载当前界面的上一页面和下一页面,并销毁其他页面,

分别调用的是

instantiateItem(ViewGroup container, int position)

destroyItem(ViewGroup container, int position, Object object)

这两个方法,使用LogCat可以很容易验证上面的说法。


但是,有时候我们有这样的需求:ViewPager中滑动至某个页面时,才加载当前页面的数据,

这样做,主要是为了避免用户大量的流量损失。

这种做法,称为ViewPager的懒加载。


怎么实现呢?


查看ViewPager有关预加载的源码,我们看到它是这样设定的:

public void setOffscreenPageLimit(int limit) {
        if (limit < DEFAULT_OFFSCREEN_PAGES) {
            Log.w(TAG, "Requested offscreen page limit " + limit + " too small; defaulting to " +
                    DEFAULT_OFFSCREEN_PAGES);
            limit = DEFAULT_OFFSCREEN_PAGES;
        }
        if (limit != mOffscreenPageLimit) {
            mOffscreenPageLimit = limit;
            populate();
        }
    }

limit默认为1,就是预加载的页面数,
DEFAULT_OFFSCREEN_PAGES

这个是ViewPager中一个fina类型的常量,默认为1

是不是我们调用这个方法,传入0就可以实现懒加载呢?

事实上,我们思考下这段代码中的逻辑,就知道,传入0,是不起作用的。


那怎么实现懒加载?


自定义一个ViewPager。


创建一个MyViewPager的类,将整个ViewPager的源码粘贴进去。

将以下这个参数改为0,

private static final int DEFAULT_OFFSCREEN_PAGES = 0; 	//默认的加载页面,ViewPager是1个,所以会加载两个Fragment

之后写代码都使用这个ViewPager就可以实现懒加载了。


这里有一点要注意一下,不要使用API版本过高的ViewPager源码,在高版本源码中(ViewPager接近3000行),谷歌改了其中一些逻辑,

即使修改这个参数,也无济于事。

最好找14左右的ViewPager源码。






  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值