实现类似微信的延迟加载的Fragment——LazyFragment

来源:互联网 发布:网络直播平台排名 编辑:程序博客网 时间:2024/05/17 07:49

参考微信,使用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()。

0 0
原创粉丝点击