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代码:

[java]  view plain copy
  1. /** 
  2.  * Author: wangjie 
  3.  * Email: [email protected] 
  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()。

你可能感兴趣的:(Fragment)