文档章节

Android Fragment+ViewPager 懒加载

H
 Heqiwen
发布于 2017/05/08 14:11
字数 675
阅读 12
收藏 0
public abstract class BaseLazyFragment extends BaseFragment {

    private boolean isFragmentVisible;
    private boolean isFirstVisible = true;
    private View rootView;
    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        //如果setUserVisibleHint()在rootView创建前调用时,那么
        //就等到rootView创建完后才回调onFragmentVisibleChange(true)
        //保证onFragmentVisibleChange()的回调发生在rootView创建完成之后,以便支持ui操作
        if (rootView == null) {
            rootView = view;
            if (getUserVisibleHint()) {
                if (isFirstVisible) {
                    onLoadData();
                    isFirstVisible = false;
                }
                onFragmentVisibleChange(true);
                isFragmentVisible = true;
            }
        }
        super.onViewCreated(rootView, savedInstanceState);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        initVariable();
    }

    private void initVariable() {
        isFirstVisible = true;
        isFragmentVisible = false;
        rootView = null;
    }



    /**
     * 去除setUserVisibleHint()多余的回调场景,保证只有当fragment可见状态发生变化时才回调
     * 回调时机在view创建完后,所以支持ui操作,解决在setUserVisibleHint()里进行ui操作有可能报null异常的问题
     * <p>
     * 可在该回调方法里进行一些ui显示与隐藏,比如加载框的显示和隐藏
     *
     * @param isVisible true  不可见 -> 可见
     *                  false 可见  -> 不可见
     */
    protected void onFragmentVisibleChange(boolean isVisible) {

    }

    /**
     * 在fragment首次可见时回调,可在这里进行加载数据,保证只在第一次打开Fragment时才会加载数据,
     * 这样就可以防止每次进入都重复加载数据
     * 该方法会在 onFragmentVisibleChange() 之前调用,所以第一次打开时,可以用一个全局变量表示数据下载状态,
     * 然后在该方法内将状态设置为下载状态,接着去执行下载的任务
     * 最后在 onFragmentVisibleChange() 里根据数据下载状态来控制下载进度ui控件的显示与隐藏
     */
    protected void onLoadData() {
    }

    public boolean isFragmentVisible() {
        return isFragmentVisible;
    }

    /**
     * setUserVisibleHint()在Fragment创建时会先被调用一次,传入isVisibleToUser = false
     * 如果当前Fragment可见,那么setUserVisibleHint()会再次被调用一次,传入isVisibleToUser = true
     * 如果Fragment从可见->不可见,那么setUserVisibleHint()也会被调用,传入isVisibleToUser = false
     * 总结:setUserVisibleHint()除了Fragment的可见状态发生变化时会被回调外,在new Fragment()时也会被回调
     * 如果我们需要在 Fragment 可见与不可见时干点事,用这个的话就会有多余的回调了,那么就需要重新封装一个
     *
     * @param isVisibleToUser
     */
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        //setUserVisibleHint()有可能在fragment的生命周期外被调用
        if (rootView == null) {
            return;
        }

        if (isFirstVisible && isVisibleToUser) {
            onLoadData();
            isFirstVisible = false;
        }

        if (isVisibleToUser) {
            onFragmentVisibleChange(true);
            isFragmentVisible = true;
            return;
        }

        if (isFragmentVisible) {
            isFragmentVisible = false;
            onFragmentVisibleChange(false);
        }
    }
}

/**
 * Called immediately after {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}
 * has returned, but before any saved state has been restored in to the view.
 * This gives subclasses a chance to initialize themselves once
 * they know their view hierarchy has been completely created.  The fragment's
 * view hierarchy is not however attached to its parent at this point.
 * @param view The View returned by {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}.
 * @param savedInstanceState If non-null, this fragment is being re-constructed
 * from a previous saved state as given here.
 */
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
}

onViewCreated(View view, @Nullable Bundle savedInstanceState) 在onCreateView(LayoutInflater, ViewGroup, Bundle) 之后调用

© 著作权归作者所有

共有 人打赏支持
H
粉丝 0
博文 3
码字总数 1942
作品 0
成都
私信 提问
fragment+viewpager

从fragment跳转到一个activity后,再finish这个activity!返回刷新就出现刷新错位(刷新的总是前一个fragment) 但下拉刷新没问题(如果实在第一个fragment中返回刷新就没问题)...

奉风峰
2015/01/08
406
1
android中使用Fragment+ViewPager实现滑动切换tab效果出现的问题

使用Fragment+ViewPager时出现无法初始化类,Home是我的Activity,什么问题啊?网上的解说好像不太能解决我的问题,希望这里能有高人帮我。

yuhuajie
2015/03/24
712
0
【原创译文】深入理解Android为什么不允许Room数据库对象间(外键)引用

【原创译文】深入理解Android为什么不允许Room数据库对象间(外键)引用 译者zhangphil@csdn注:当我开始使用Android Room技术时候,Room明确禁止对象间外键引用,让我感觉不可思议,也觉得不...

开开心心过
2017/11/24
0
0
android 图片加载之边下载边显示的讨论。

最近,接触的项目的图片加载都有不少的应用。大概了解了,不外乎一下几种,或者兼顾几种做法: |-采用缓存来提高用户体验,也节约流量。 |-缓存上做文章,采用多种策略的缓存模式,来达到更加...

Justin_Chiang
2013/12/25
1K
7
Android IOC注解库EasyUI

EasyUI介绍 1.使用反射机制和注解实现类似于butterknife的IOC框架 2.快速的findViewById和OnClick 3.扩展了click时无网络监测 4.扩展了快速点击监测 使用方法 1.引用 2.初始化(可选) 该步骤...

木头同学
07/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Quartz + Oracle 分布式Job实现

简述 实现 依赖包 <dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.2.3</version><exclusions><exclusion><groupId>com.zax......

呼呼南风
14分钟前
4
0
崛起于Springboot2.X之集成规则引擎Drools(41)

1、创建Springboot项目,勾选Web模块和lombok插件 2、添加pom其他依赖 <dependency> <groupId>org.kie</groupId> <artifactId>kie-spring</artifactId> <version>7.11.0.Fin......

木九天
22分钟前
4
0
怎样使用Chrome浏览器截取整个网页?

1、打开控制台:Ctrl + Shift + I 2、命令执行:Ctrl + Shift + P 3、Capture full size screenshot 浏览器会自动下载截图图片,推荐过几个扩展功能: 1.全屏幕截取网页编辑共享神器-Awesom...

近在咫尺远在天涯
25分钟前
4
0
Ubuntu下提示WPS字体缺失解决

Ubuntu 下提示WPS字体缺失解决 Ubuntu下安装wps成功后,首次打开WPS会提示一个系统检查的错误信息,如下图所示: 产生的原因是:WPS在Ubuntu下找不到相应的字体,我们需要自己手动的添加一下...

calmsnow
26分钟前
1
0
Spring Boot实现邮件服务,附常见邮箱的配置

1. pom.xml文件中引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId></dependency> 2. 接口及实现......

豫华商
29分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部