[Android]實現相似微信的延遲加載的Fragment——LazyFragment

如下內容爲原創,轉載請註明:html

來自每天博客:http://www.cnblogs.com/tiantianbyconan/p/4303910.html 微信

 

參考微信,使用ViewPager來顯示不一樣的tab,每一個tab是一個Fragment,ide

假設有3個tab,對應的fragment是FragmentA、FragmentB、FragmentCspa

須要實現的效果是進入後,默認先只加載FragmentA,具體滑動到了哪一個Fragment,再去加載該Fragment的數據。code

能夠參考以下BaseLazyFragment代碼:htm

  1 /**
  2  * Author: wangjie
  3  * Email: tiantian.china.2@gmail.com
  4  * Date: 1/23/15.
  5  */
  6 public class BaseLazyFragment extends BaseFragment {
  7     private static final String TAG = BaseLazyFragment.class.getSimpleName();
  8     private boolean isPrepared;
  9 
 10     @Override
 11     public void onActivityCreated(Bundle savedInstanceState) {
 12         super.onActivityCreated(savedInstanceState);
 13         initPrepare();
 14     }
 15 
 16 
 17     /**
 18      * 第一次onResume中的調用onUserVisible避免操做與onFirstUserVisible操做重複
 19      */
 20     private boolean isFirstResume = true;
 21 
 22     @Override
 23     public void onResume() {
 24         super.onResume();
 25         if (isFirstResume) {
 26             isFirstResume = false;
 27             return;
 28         }
 29         if (getUserVisibleHint()) {
 30             onUserVisible();
 31         }
 32     }
 33 
 34     @Override
 35     public void onPause() {
 36         super.onPause();
 37         if (getUserVisibleHint()) {
 38             onUserInvisible();
 39         }
 40     }
 41 
 42     private boolean isFirstVisible = true;
 43     private boolean isFirstInvisible = true;
 44 
 45     @Override
 46     public void setUserVisibleHint(boolean isVisibleToUser) {
 47         super.setUserVisibleHint(isVisibleToUser);
 48         if (isVisibleToUser) {
 49             if (isFirstVisible) {
 50                 isFirstVisible = false;
 51                 initPrepare();
 52             } else {
 53                 onUserVisible();
 54             }
 55         } else {
 56             if (isFirstInvisible) {
 57                 isFirstInvisible = false;
 58                 onFirstUserInvisible();
 59             } else {
 60                 onUserInvisible();
 61             }
 62         }
 63     }
 64 
 65     public synchronized void initPrepare() {
 66         if (isPrepared) {
 67             onFirstUserVisible();
 68         } else {
 69             isPrepared = true;
 70         }
 71     }
 72 
 73     /**
 74      * 第一次fragment可見(進行初始化工做)
 75      */
 76     public void onFirstUserVisible() {
 77 
 78     }
 79 
 80     /**
 81      * fragment可見(切換回來或者onResume)
 82      */
 83     public void onUserVisible() {
 84 
 85     }
 86 
 87     /**
 88      * 第一次fragment不可見(不建議在此處理事件)
 89      */
 90     public void onFirstUserInvisible() {
 91 
 92     }
 93 
 94     /**
 95      * fragment不可見(切換掉或者onPause)
 96      */
 97     public void onUserInvisible() {
 98 
 99     }
100 
101 }

如上代碼,使用setUserVisibleHint方法做爲回調的依據,blog

暴露出來讓子類使用的新的生命週期方法爲:生命週期

- onFirstUserVisible();事件

第一次fragment可見(進行初始化工做)get

- onUserVisible(); 

fragment可見(切換回來或者onResume)

- onFirstUserInvisible();

第一次fragment不可見(不建議在此處理事件)

- onUserInvisible();

fragment不可見(切換掉或者onPause)

 

具體的效果是:

1. 首先加載ViewPager,回調FragmentA(第一個默認呈現的Fragment)的onFirstUserVisible(),能夠在這裏進行FragmentA的初始化工做,其餘Fragment保持不變。

2. 用戶從FragmentA滑動到FragmentB,回調FragmentA的onUserInvisible()、FragmentB的onFirstUserVisible()(由於第一次切換到FragmentB,能夠在這裏進行初始化工做)。

3. 用戶從FragmentB滑動到FragmentC,回調FragmentB的onUserInvisible()、FragmentC的onFirstUserVisible()(由於第一次切換到FragmentC,能夠在這裏進行初始化工做)。

4. 用戶從FragmentC滑動到FragmentB,回調FragmentC的onUserInvisible()、FragmentB的onUserVisible()(由於FragmentB以前已經被加載過)。

5. 由於到此爲止,suoyou的Fragment都已經被加載過了,因此之後這3個Fragment互相任意切換,只會回調原來Fragment的onUserInvisible()和切換後的Fragment的onUserVisible()。

6. 用戶處於FragmentB,關閉手機屏幕,回調FragmentB的onUserInvisible()。

7. 用戶處於FragmentB,手機屏幕處關閉狀態,而後開啓手機屏幕解鎖,只回調FragmentB的onUserVisible()。

相關文章
相關標籤/搜索