文档章节

Android Fragment+ViewPager 懒加载

H
 Heqiwen
发布于 2017/05/08 14:11
字数 675
阅读 17
收藏 0

精选30+云产品,助力企业轻松上云!>>>

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
426
1
android中使用Fragment+ViewPager实现滑动切换tab效果出现的问题

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

yuhuajie
2015/03/24
731
0
Fragment的懒加载与生命周期详解

Fragment的懒加载与生命周期详解 什么是懒加载 了解Fragment的生命周期 onAttach onCreate onCreateView onActivityCreated onStart onResume onPause onStop onDestroyView onDestroy onDet......

悠哉游凤
04/26
0
0
Android之Fragment

Fragment(碎片)概括: Fragment是依赖于Activity的,不能独立存在的。 一个Activity里可以有多个Fragment。 一个Fragment可以被多个Activity重用。 Fragment有自己的生命周期,并能接收输入...

一点光
03/16
9
0
Fragment结合ViewPager之懒加载

什么是懒加载?为什么要用懒加载?### 1、什么是懒加载 懒加载就是当ViewPager和Fragment结合在一起使用时,Fragment呈现在用户面前时才加载数据,当其从未被呈现在用户面前时,不会执行加载...

osc_k816frzg
2018/01/08
4
0

没有更多内容

加载失败,请刷新页面

加载更多

跨越了6个阶段,我仍然是生物信息学初学者

首先非常欢迎大家分享自己与生物信息学/生信技能树的故事! 上一期是:我如何从生物科学到生物信息 这一期是我在朋友圈看到了我们单细胞天地常驻编辑周运来的真情流露,邀请他投稿的我们生信...

biotrainee
前天
17
0
网飞是如何运用心理学来完善其客户体验的

原文地址:https://36kr.com/p/5289228 译者:俊一 占据全球网站流量 15%的奈飞,其用户体验设计背后有哪些秘密? 神译局是 36 氪旗下编译团队,关注科技、商业、职场、生活等领域,重点介绍...

高行
02/08
23
0
shell编程中的循环脚本

本文中的部分脚本来源于网络,就不申明原创了,如果这些东西自己学会了,那就是属于自己的了。 求从1加到100的和 使用for循环求和: #!/bin/bash declare -i sum=0 for ((i=1;i<=100;i++));...

Double_冬
2018/08/16
14
0
智能合约:介绍、geth、Ethereum Wallet

从看雪论坛换了一本《智能合约安全分析和审计指南》,看了一些智能合约相关的内容,因为我之前对于区块链的了解仅仅是只知道世界上有一种叫做比特币的东西,所以对于这些概念的理解还是比较困...

yichen115
04/26
9
0
Vue和React技术风格上的不同

在主流框架中,Vue和React都属于全球热门,各自有着大量用户,两者之间的优缺点便带来了众多讨论。 那么这两者之间的关键区别在于哪些方面?为何熟练掌握Vue成为越来越多公司的岗位要求? Vu...

若川
07/02
24
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部