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


    参考微信,使用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()。

  • 相关阅读:
    MyWebViewDemo【封装Webview常用配置和选择文件、打开相机、录音、打开本地相册的用法】
    PhotoPickerNewDemo【PhotoPicker0.9.12的个性化修改以及使用(内部glide版本号是4.1.1)】
    PhotoPickerDemo【PhotoPicker0.9.8的个性化修改以及使用(内部glide版本号是3.7.0)】
    轻松理解MYSQL MVCC 实现机制
    MySQL-InnoDB-MVCC多版本并发控制
    Mysql中MVCC的使用及原理详解
    wmi的作用
    Java中BIO,NIO,AIO的理解
    Netty--索引
    Netty 入门示例
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/4718709.html
Copyright © 2020-2023  润新知