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. }  
發佈了32 篇原創文章 · 獲贊 45 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章