实现类似微信的延迟加载的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.
 */
public class BaseLazyFragment extends BaseFragment {
    private static final String TAG = BaseLazyFragment.class.getSimpleName();
    private boolean isPrepared;

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        initPrepare();
    }

    /**
     * 第一次onResume中的调用onUserVisible避免操作与onFirstUserVisible操作重复
     */
    private boolean isFirstResume = true;

    @Override
    public void onResume() {
        super.onResume();
        if (isFirstResume) {
            isFirstResume = false;
            return;
        }
        if (getUserVisibleHint()) {
            onUserVisible();
        }
    }

    @Override
    public void onPause() {
        super.onPause();
        if (getUserVisibleHint()) {
            onUserInvisible();
        }
    }

    private boolean isFirstVisible = true;
    private boolean isFirstInvisible = true;

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser) {
            if (isFirstVisible) {
                isFirstVisible = false;
                initPrepare();
            } else {
                onUserVisible();
            }
        } else {
            if (isFirstInvisible) {
                isFirstInvisible = false;
                onFirstUserInvisible();
            } else {
                onUserInvisible();
            }
        }
    }

    public synchronized void initPrepare() {
        if (isPrepared) {
            onFirstUserVisible();
        } else {
            isPrepared = true;
        }
    }

    /**
     * 第一次fragment可见(进行初始化工作)
     */
    public void onFirstUserVisible() {

    }

    /**
     * fragment可见(切换回来或者onResume)
     */
    public void onUserVisible() {

    }

    /**
     * 第一次fragment不可见(不建议在此处理事件)
     */
    public void onFirstUserInvisible() {

    }

    /**
     * fragment不可见(切换掉或者onPause)
     */
    public void onUserInvisible() {

    }

}

如上代码,使用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-11-05 02:23:35

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

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

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

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

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

小功能——类似微信里,评论内容里面,点击每个人的用户名进入个人主页

项目里的朋友圈页面,每幅图片的评论内容里面,有不同的用户进行评论,起初想法是点击用户名直接进行回复,后来看微信都是点击评论内容进行回复评论的发起人,这个好做,把这个textview绑定一个监听器就ok了 后来再一想,如果要实现类似微信点击用户名就进入用户的主页,怎么让用户名可以点击呢? 现在父布局下面在new一个水平布局的linearlayout,然后根据把每个用户.包括评论内容都设置进textview里面,然后通过linearlayout的addview()方法,把这些textview添加进去

安卓仿微信Tab页用Fragment实现

最终效果图如: 实现步骤: 新建项目tabdemo,我选的是4.0.3版本,然后依次新建三个Fragment,名字分别为:ChatFragment.FriendFragment.FindFragment,他会生成对应的界面布局xml文件. 项目资源管理器结构如下: Drawable中是用到的三张图片,可自行找然后粘进去. 对应的Java代码如下: package com.example.administrator.tabdemo; import android.content.Context;

iOS开发>学无止境 - AKTabBarController:类似微信的第三方库

自从有了评论之后,就可以很方便的和大家交流.以前都是我一个人默默的发文章,看不出大家对文章的看法.评论开通之后,就可以很快速的获取大家对文章的看法. 有人会指出文章里有错误的地方,真的很感激他们,非常的认真:有人会对文章说出自己的见解,加深自己的印象,同时,也能帮助到其他的朋友:有人也会在评论里,提出一些问题,但是鉴于评论的字数限制,只能简单的回答一下. 在昨天的文章评论里面,有一个朋友提出了一个问题,关于微信导航栏的. 问题分析和解答 问: 自定义导航栏怎么写?就像微信那样,tabBar的四个

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

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

实现类似微信语音播放动画的效果

要求就是点击播放按钮,小喇叭开始动,当语音结束后,停止动画.如图: 这需要用到UIImageView的帧动画,该动画可以让一系列图片在特定的时间内按顺序显示出来.需要的素材如下: audio_icon_1 *****分割线***** audio_icon_2 *******分割线*******audio_icon_3 代码如下: // 添加播放时候的动画图片 [_audioBtn addSubview:self.animationview]; [_audioBtn setImage:[UIIma

利用html5实现类似微信的手机摇一摇功能

利用html5实现类似微信的手机摇一摇功能,并播放音乐. 1.  deviceOrientation:封装了方向传感器数据的事件,可以获取手机静止状态下的方向数据,例如手机所处角度.方位.朝向等. 2.  deviceMotion:封装了运动传感器数据的事件,可以获取手机运动状态下的运动加速度等数据. 不多说直接上代码, Javascript: [javascript] view plaincopy var SHAKE_THRESHOLD = 3000; var last_update = 0;

类似微信通讯录界面的排序方法及中文转拼音的方法

最近做一个类似微信的通讯录列表,因为本人也算个新手,然后呢,就遇到点问题.难点在对昵称的排序上,顺带着也就找了找中文转拼音的方法. 废话不多说,直接贴代码吧 1.首先要对昵称字符串进行中文转拼音,这个比较简单,写到NSString分类里面就行. - (NSString *)pinyin; { NSMutableString *str = [self mutableCopy]; CFStringTransform(( CFMutableStringRef)str, NULL, kCFStringT