Fragment与Viewpager实现懒加载

本文转载自:http://blog.csdn.net/q844258542/article/details/51525749(非常感谢博主的分享)


项目当中使用到tablayout+viewpager+fragment组合, 也是现在app非常流行的一种设计.

viewpager切换页面时,让fragment进行懒加载操作,是比较好的体验,节省省流量,避免预加载时造成的卡顿现象.

懒加载操作主要使用到fragment 的 setUserVisibleHint() , 及getUserVisibleHint()方法

setUserVisibleHint() 方法在viewpageradapter内部调用, 会为fragment 进行赋值, 如果fragment 不可见赋值为false. 反之为true.

getUserVisibleHint() 方法是获取这个值, 通过fragment 当前是否可见, 来进行加载数据的操作, 这样就实现了预加载的功能.

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package cn.cibn.haokan.ui.categoryList;  
  2.   
  3. import android.os.Bundle;  
  4. import android.view.LayoutInflater;  
  5. import android.view.View;  
  6. import android.view.ViewGroup;  
  7. import cn.cibn.haokan.ui.base.ImgBaseFragment;  
  8.   
  9. public abstract class LazyFragment extends ImgBaseFragment{  
  10.       
  11.      /** 
  12.      * Fragment title 
  13.      */  
  14.     public String fragmentTitle;  
  15.     /** 
  16.      * 是否可见状态 
  17.      */  
  18.     private boolean isVisible;  
  19.     /** 
  20.      * 标志位,View已经初始化完成。 
  21.      * 2016/04/29 
  22.      * 用isAdded()属性代替 
  23.      * 2016/05/03 
  24.      * isPrepared还是准一些,isAdded有可能出现onCreateView没走完但是isAdded了 
  25.      */  
  26.     private boolean isPrepared;  
  27.     /** 
  28.      * 是否第一次加载 
  29.      */  
  30.     private boolean isFirstLoad = true;  
  31.   
  32.   
  33.     @Override  
  34.     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  
  35.         // 若 viewpager 不设置 setOffscreenPageLimit 或设置数量不够  
  36.         // 销毁的Fragment onCreateView 每次都会执行(但实体类没有从内存销毁)  
  37.         // 导致initData反复执行,所以这里注释掉  
  38.         // isFirstLoad = true;  
  39.   
  40.         // 2016/04/29  
  41.         // 取消 isFirstLoad = true的注释 , 因为上述的initData本身就是应该执行的  
  42.         // onCreateView执行 证明被移出过FragmentManager initData确实要执行.  
  43.         // 如果这里有数据累加的Bug 请在initViews方法里初始化您的数据 比如 list.clear();  
  44.         isFirstLoad = true;  
  45.         View view = initViews(inflater, container, savedInstanceState);  
  46.         isPrepared = true;  
  47.         lazyLoad();  
  48.         return view;  
  49.     }  
  50.   
  51.     /** 
  52.      * 如果是与ViewPager一起使用,调用的是setUserVisibleHint 
  53.      * 
  54.      * @param isVisibleToUser 是否显示出来了 
  55.      */  
  56.     @Override  
  57.     public void setUserVisibleHint(boolean isVisibleToUser) {  
  58.         super.setUserVisibleHint(isVisibleToUser);  
  59.         if (getUserVisibleHint()) {  
  60.             isVisible = true;  
  61.             onVisible();  
  62.         } else {  
  63.             isVisible = false;  
  64.             onInvisible();  
  65.         }  
  66.     }  
  67.   
  68.     /** 
  69.      * 如果是通过FragmentTransaction的show和hide的方法来控制显示,调用的是onHiddenChanged. 
  70.      * 若是初始就show的Fragment 为了触发该事件 需要先hide再show 
  71.      * 
  72.      * @param hidden hidden True if the fragment is now hidden, false if it is not 
  73.      *               visible. 
  74.      */  
  75.     @Override  
  76.     public void onHiddenChanged(boolean hidden) {  
  77.         super.onHiddenChanged(hidden);  
  78.         if (!hidden) {  
  79.             isVisible = true;  
  80.             onVisible();  
  81.         } else {  
  82.             isVisible = false;  
  83.             onInvisible();  
  84.         }  
  85.     }  
  86.   
  87.     protected void onVisible() {  
  88.         lazyLoad();  
  89.     }  
  90.   
  91.     protected void onInvisible() {  
  92.     }  
  93.   
  94.     /** 
  95.      * 要实现延迟加载Fragment内容,需要在 onCreateView 
  96.      * isPrepared = true; 
  97.      */  
  98.     protected void lazyLoad() {  
  99.         if (isPrepared && isVisible && isFirstLoad) {  
  100.             isFirstLoad = false;  
  101.             initData();  
  102.         }  
  103.     }  
  104.   
  105.     protected abstract View initViews(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState);  
  106.   
  107.     protected abstract void initData();  
  108. }  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值