常用ViewPager的开发者一定知道,谷歌为了增强用户体验,ViewPager加载页面时默认会预加载当前界面的上一页面和下一页面,并销毁其他页面,
分别调用的是
instantiateItem(ViewGroup container, int position)
destroyItem(ViewGroup container, int position, Object object)
但是,有时候我们有这样的需求: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(); } }
DEFAULT_OFFSCREEN_PAGES
这个是ViewPager中一个fina类型的常量,默认为1
是不是我们调用这个方法,传入0就可以实现懒加载呢?
事实上,我们思考下这段代码中的逻辑,就知道,传入0,是不起作用的。
那怎么实现懒加载?
自定义一个ViewPager。
创建一个MyViewPager的类,将整个ViewPager的源码粘贴进去。
将以下这个参数改为0,
private static final int DEFAULT_OFFSCREEN_PAGES = 0; //默认的加载页面,ViewPager是1个,所以会加载两个Fragment
这里有一点要注意一下,不要使用API版本过高的ViewPager源码,在高版本源码中(ViewPager接近3000行),谷歌改了其中一些逻辑,
即使修改这个参数,也无济于事。
最好找14左右的ViewPager源码。