安卓开发中禁掉ViewPager预加载问题

这篇博客探讨了如何在安卓开发中禁掉ViewPager的预加载行为。通过创建一个BaseFragment基类,并覆盖 setUserVisibleHint 方法,实现当Fragment可见时调用onVisible()进行加载,不可见时调用onInvisible()。子类需要重写lazyLoad()方法来进行延迟加载,以此达到禁用预加载的效果。
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在其中做判断,代码如下:
 
  1. import android.support.v4.app.Fragment;  
  2.   
  3. public abstract class BaseFragment extends Fragment {  
  4.       
  5.     /** Fragment当前状态是否可见 */  
  6.     protected boolean isVisible;  
  7.       
  8.       
  9.     @Override  
  10.     public void setUserVisibleHint(boolean isVisibleToUser) {  
  11.         super.setUserVisibleHint(isVisibleToUser);  
  12.           
  13.         if(getUserVisibleHint()) {  
  14.             isVisible = true;  
  15.             onVisible();  
  16.         } else {  
  17.             isVisible = false;  
  18.             onInvisible();  
  19.         }  
  20.     }  
  21.       
  22.       
  23.     /** 
  24.      * 可见 
  25.      */  
  26.     protected void onVisible() {  
  27.         lazyLoad();       
  28.     }  
  29.       
  30.       
  31.     /** 
  32.      * 不可见 
  33.      */  
  34.     protected void onInvisible() {  
  35.           
  36.           
  37.     }  
  38.       
  39.       
  40.     /**  
  41.      * 延迟加载 
  42.      * 子类必须重写此方法 
  43.      */  
  44.     protected abstract void lazyLoad();  
  45. }  
  
     在我们的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源码。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值