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

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

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

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

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

可以参考如下BaseLazyFragment代码:

/** * 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()。

 

转载地址:http://mbvyx.baihongyu.com/

你可能感兴趣的文章
深入理解浏览器的缓存机制
查看>>
微软向Linux社区开放60000多项专利:对开源微软是认真的
查看>>
Hoshin Kanri在丰田的应用
查看>>
又拍云沈志华:如何打造一款安全的App
查看>>
克服大数据集群的挑战
查看>>
PostgreSQL并发控制(MVCC, 事务,事务隔离级别)
查看>>
DM***的第二阶段OSPF
查看>>
20180702搭建青岛RAC记录
查看>>
Spring Security OAuth 实现OAuth 2.0 授权
查看>>
linux文件及简单命令学习
查看>>
dubbo源码分析-架构
查看>>
新 Terraform 提供商: Oracle OCI, Brightbox, RightScale
查看>>
6套毕业设计PPT模板拯救你的毕业答辩
查看>>
IT兄弟连 JavaWeb教程 JSP与Servlet的联系
查看>>
Windows phone 8 学习笔记
查看>>
linux并发连接数:Linux下高并发socket最大连接数所受的各种限制
查看>>
详解区块链中EOS的作用。
查看>>
我的友情链接
查看>>
mysql-error 1236
查看>>
sshd_config设置参数笔记
查看>>