ViewPager懒加载的简单实现

来源:互联网 发布:python unicode 编辑:程序博客网 时间:2024/06/07 05:42

常用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 0
原创粉丝点击