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

时间: 2024-10-11 00:32:54

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

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

参考微信,使用ViewPager来显示不同的tab,每个tab是一个Fragment, 假设有3个tab,对应的fragment是FragmentA.FragmentB.FragmentC 需要实现的效果是进入后,默认先只加载FragmentA,具体滑动到了哪个Fragment,再去加载该Fragment的数据. 可以参考如下BaseLazyFragment代码: /** * Author: wangjie * Email: [email protected] * Date: 1/23/15.

android 实现类似微信缓存和即时更新好友头像

引言 使用微信时我们会发现,首次进入微信的好友列表时,会加载好友头像,但是再次进入时,就不用重新加载了,而且其他页面都不用重新加载,说明微信的好友头像是缓存在本地的,然后好友修改头像后,又会及时的更新,这个功能是如何实现的呢,我们来分析一下 分析 关于头像缓存的实现 头像是网络图片,而且数据量较大,如果用我们常用的SharedPreferences将头像以Bitmap的形式存储,势必会造成OOM,这个方法是行不通的,我们存储的只能是图片的地址,但是如果只存储地址的话,要转化成图片,还是要通过网络

Android封装类似微信的顶部TitleBar弹出的PopupWindow代码

Android仿微信顶部titlebar,点击加号弹出的PopupWindow,是封装好的PopupWindow,直接拿来用即可,先看效果图:  调用代码非常简单,这是MainActivity的代码: public class MainActivity extends AppCompatActivity { private TitlePopup titlePopup; @Override protected void onCreate(Bundle savedInstanceState) { s

【android】类似微信底部按钮标签实现

这里用到的是fragment 原理大概如下 1.首先新建一个activity,在xml里面分为上下两个部分,上面是一个RelativeLayout,下面是一个LinearLayout,里面装有四个按钮. 2.然后新建4个fragment的activity,分别新建自己的xml. java代码如下 public class fragmentActivity1 extends Fragment{ public View onCreateView(LayoutInflater inflater, Vi

Android 实现类似微信客户端朋友圈更新提示的小红点

用到的类: com.jauker.widget.BadgeView 实现代码: 1 BadgeView imageBadge = new BadgeView(getContext()); 2 imageBadge.setTargetView(mHolder.image); 3 imageBadge.setText(""); 4 imageBadge.setHeight(30); 5 imageBadge.setWidth(30); 6 imageBadge.setBackground(

Android学习--------实现增删改查数据库操作以及实现类似微信好友对话管理操作

最近的一个实验用到东西挺多,特地总结一下. 要求功能: 1.第一个页面添加歌曲名和歌手,跳到第二个页面列表显示所有记录,使用sqlite数据库 2.对于第二个页面显示的信息可以进行删除和修改操作,并自动刷新 最后我做的效果: 长按列表项弹出单个管理的菜单,像微信好友对话管理一样. 删除时可以直接删除这一条并在列表中直接显示,更新时弹出对话框更新内容提交后在列表中重新显示. 做此例遇到的困难: 1.菜单获取上下文 2.获取对话框中的内容 3.对话框按钮添加监听事件-----注意包不要导错:impo

基于Android的计步器(Pedometer)的讲解(一)——Fragment页面跳转

首先需要做的是实现几个页面的跳转,既类似微信的点击按钮,切换页面. 话不多说,这是一个简单的页面切换的Demo,先贴几张实现的效果: 图片的底部是5个RadioButton,用来进行页面之间的切换.剩下的部分是一个LinearLayout的布局,用来镶嵌5个Fragment(碎片)的页面. 一共用到5个类:MainActivity.MyAdapter.FragmentHistory.FragmentAnalysis.FragmentPedometer.FragmentPK.FragmentSet

一名Android开发者的微信小程序填坑之路(2)

前言 上一篇是九月二十七日写的,而这一篇我动笔的时间是十月十日(特殊的日子),中间相隔十三天--当然是因为国庆节.说老实话,这十三天里面我都没有碰和小程序有关的东西--毕竟学习小程序的开发也只是起于兴趣,而平时的工作并不会涉及与其相关的东西--但是在这十三天里,我能明显的感受到小程序热正在逐渐的消退,或者说大家正在逐渐以一种较为平和的姿态接受它的存在,其实这是一件好事.期待公测的到来. 接下来我就直接进入正题了,另外,文末我想和大家分享一下我的国庆节. PS:这篇文章是接着上一篇文章 一名And

android高仿微信UI点击头像显示大图片效果

转自:http://www.cnblogs.com/Jaylong/archive/2012/09/27/androidUI.html 用过微信的朋友朋友都见过微信中点击对方头像显示会加载大图,先贴两张图片说明下: 这种UI效果对用户的体验不错,今天突然有了灵感,试着去实现,结果就出来了.. 下面说说我的思路: 1.点击图片时跳转到另一个activity,然后显示加载的效果,即progressbar 2.显示图片的之前先弹出自定义dialog,然后模拟加载一段时间后,显示整张大图片,要全屏显示,