神刀安全网

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源码。

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » ViewPager懒加载的简单实现

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
分享按钮