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


以下內容為原創,轉載請注明:

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

 

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

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

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

可以參考如下BaseLazyFragment代碼:

  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方法作為回調的依據,

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

- onFirstUserVisible();

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

- 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()。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM