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

本文详细介绍了如何使用BaseLazyFragment在页面滑动时动态加载不同的Fragment,确保每次切换都能高效地加载对应的数据。通过利用setUserVisibleHint方法作为回调依据,实现Fragment的首次加载和切换时的初始化工作,以及Fragment可见和不可见时的操作,确保用户体验流畅且数据加载合理。

来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4303910.html

参考微信,使用ViewPager来显示不同的tab,每个tab是一个Fragment,

假设有3个tab,对应的fragment是FragmentA、FragmentB、FragmentC

需要实现的效果是进入后,默认先只加载FragmentA,具体滑动到了哪个Fragment,再去加载该Fragment的数据。

可以参考如下BaseLazyFragment代码:
[java] view plaincopy

/** 
 * Author: wangjie 
 * Email: tiantian.china.2@gmail.com 
 * 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()。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值