博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Android]实现类似微信的延迟加载的Fragment——LazyFragment
阅读量:6551 次
发布时间:2019-06-24

本文共 3579 字,大约阅读时间需要 11 分钟。

以下内容为原创,转载请注明:

来自天天博客: 

 

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

 

你可能感兴趣的文章
AlertView With Progressbar
查看>>
财付通打印票据和拖动银行卡效果
查看>>
MCSegmentedControl
查看>>
Linux 运行 Navicat 条件
查看>>
记一次hibernate一对多问题的解决
查看>>
ClassLoader.loadClass()与Class.forName()的区别
查看>>
python中的不定参数
查看>>
Advanced FAQ System For OpenCart 2.x
查看>>
Maven 了解
查看>>
数字签名是什么
查看>>
js向后台传汉字为乱码的解决方法。
查看>>
编程离软件工程有多远?
查看>>
String.format保留两位|多位小数
查看>>
ExtJS Getting Started
查看>>
Check Host:实时监控网站或者服务器是否可以访问
查看>>
【JEECG技术博文】online自定义模板的使用
查看>>
PHPExcel出现Formula Error的解决方案
查看>>
Javascript中call与apply的学习
查看>>
eclipse的svn插件使用
查看>>
HIVE User Guide 总结之一<HIVE结构>
查看>>