ViewPager预加载
ViewPager有一个 “预加载”的机制,默认会把ViewPager当前位置的左右相邻页面预先初始化,它的默认值是 1(看源码),这样做的好处就是ViewPager左右滑动会更加流畅,但是预先加载用户没有看到的页面的数据,会花费用户的一定的流量,所以就有了禁止ViewPager的“预加载”,节省用户流量。

通过看上面ViewPager的部分源码可知,DEFAULT_OFFSCREEN_PAGES 这里就定义了默认值是1, 所以有的人说调用ViewPager的setOffscreenPageLimit(int limit),来设置ViewPager预加载的数量,但通过这个方法设置的预加载的数量大于1才有效,也就是说,这种方案是不能禁掉预加载的,只能改变预加载的数量,如下图ViewPager源码:

我们可以看到,如果你调用该方法传进来的值小于1会被强行的赋值为1。而且DEFAULT_OFFSCREEN_PAGES 这个值是private的,子类继承ViewPager也是不可见的。
方法一:懒加载
懒加载,顾名思义,也就是延迟加载,当某个页面可见时才去加载数据。
首先,介绍两个方法void setUserVisibleHint(boolean isVisibleToUser)、boolean getUserVisibleHint(),它们分别用作设置/获得Fragment可见状态,我们可以重写Fragment在其中做判断,代码如下:
首先,介绍两个方法void setUserVisibleHint(boolean isVisibleToUser)、boolean getUserVisibleHint(),它们分别用作设置/获得Fragment可见状态,我们可以重写Fragment在其中做判断,代码如下:
- import android.support.v4.app.Fragment;
- public abstract class BaseFragment extends Fragment {
- /** Fragment当前状态是否可见 */
- protected boolean isVisible;
- @Override
- public void setUserVisibleHint(boolean isVisibleToUser) {
- super.setUserVisibleHint(isVisibleToUser);
- if(getUserVisibleHint()) {
- isVisible = true;
- onVisible();
- } else {
- isVisible = false;
- onInvisible();
- }
- }
- /**
- * 可见
- */
- protected void onVisible() {
- lazyLoad();
- }
- /**
- * 不可见
- */
- protected void onInvisible() {
- }
- /**
- * 延迟加载
- * 子类必须重写此方法
- */
- protected abstract void lazyLoad();
- }
在我们的Fragment中,只需要继承这个类,然后重写其中的lazyLoad()方法,当Fragment对用户可见(即用户切换到此Fragment时)我们在lazyLoad()中加载所需数据
方法二:copy ViewPager 源代码,修改DEFAULT_OFFSCREEN_PAGES的值为0
android虽然每个版本都有v4包,但是这些v4包是有差异的。这就造成高版本v4包里的ViewPager,即使你Copy它,将其DEFAULT_OFFSCREEN_PAGES的值改为0,还是可能不起作用的,其中的逻辑变了。
解决方案:
使用低版本v4包里的ViewPager,完全copy一份,将其中的DEFAULT_OFFSCREEN_PAGES值改为0即可。用你copy后的ViewPager代替原来v4包的ViewPager在布局文件里面使用。以下给出可行的v4包下的ViewPager源码。