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

简介: 以下内容为原创,转载请注明: 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4303910.html    参考微信,使用ViewPager来显示不同的tab,每个tab是一个Fragment, 假设有3个tab,对应的fragment是FragmentA、FragmentB、FragmentC 需要实现的效果是进入后,默认先只加载FragmentA,具体滑动到了哪个Fragment,再去加载该Fragment的数据。

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

来自天天博客: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()。

 

相关文章
|
弹性计算
阿里云4核16G游戏专用服务器26元,就问你服不服?
阿里云4核16G游戏专用服务器26元,就问你服不服?
|
关系型数据库 数据库 PostgreSQL
postgresql|数据库|启动数据库时报错:FATAL: could not map anonymous shared memory的解决
postgresql|数据库|启动数据库时报错:FATAL: could not map anonymous shared memory的解决
528 1
|
10月前
|
NoSQL 安全 关系型数据库
2024Mysql And Redis基础与进阶操作系列(6)作者——LJS[含MySQL 多表之一对一/多;多对多;多表联合查询等详解步骤及常见报错问题所对应的解决方法]
MySQL 多表之一对一/多;多对多;多表联合之交叉连接;内连接;左、右、外、满、连接;子查询及关键字;自连接查询等详解步骤及常见报错问题所对应的解决方法
|
监控 物联网 数据安全/隐私保护
智能家居包含了众多设备,在通过智能化技术提升居家生活的便利性、安全性、节能性和舒适度
智能家居系统包含了众多设备,旨在通过智能化技术提升居家生活的便利性、安全性、节能性和舒适度。以下是一些智能家居系统中常见的设备类别及其基本操作简述:
|
Linux 编译器 Windows
【Linux】新唐NUC977系统编译及烧写流程
【Linux】新唐NUC977系统编译及烧写流程
269 0
|
机器学习/深度学习 编解码 人工智能
【生成式对抗网络】GANs在数据生成、艺术创作,以及在增强现实和虚拟现实中的应用
生成对抗网络(Generative Adversarial Networks, GANs)在数据生成领域具有显著的应用价值。GANs通过生成器(Generator)和判别器(Discriminator)两个相互竞争的神经网络,不断迭代优化,从而生成高质量的数据样本。这一技术在数据增强方面尤为重要,特别是在数据稀缺或难以获取的领域,如医疗影像分析、自动驾驶等。GANs能够生成与真实数据相似的新数据样本,从而扩充数据集规模,提高模型的泛化能力。此外,GANs还可以用于生成仿真数据,如金融领域中的股票价格走势,用于训练预测模型,提高预测准确性
278 2
|
JSON 机器人 Go
go接收alertmanager告警并发送钉钉
go接收alertmanager告警并发送钉钉
192 0
|
机器学习/深度学习
svn commit 用法
svn commit 用法
1111 0
|
运维 监控 持续交付
运维即代码(Operations as Code,简称 OaC)
运维即代码(Operations as Code,简称 OaC)是一种理念,它将运维任务和流程通过代码的形式进行自动化和标准化。这种方法可以帮助企业降低运维成本,提高运维效率,并确保运维任务的可靠性和一致性。
323 1
EndNote论文参考文献中文文章与英文文章前后顺序修改排列方法
EndNote论文参考文献中文文章与英文文章前后顺序修改排列方法
503 1

热门文章

最新文章