Fragment延迟加载

来源:互联网 发布:神优化单机游戏低配 编辑:程序博客网 时间:2024/06/05 17:52

Fragment使用最多的地方应该就是ViewPager和TabLayout结合,实现类似微信既可以点击也可以左右滑动进行切换页面。或者使用Drawerlayout侧栏通过FragmentTransaction.add()、show()、hide();实现类似最新版Gmail侧栏点击切换。

在实际开发中,考虑性能和体验等方面,需要在页面可见时,再加载数据。这样就有两种情况:1,在页面第一次可见时,加载数据,往后再次进入到该页面,需要手动刷新重新获取数据;2,无论何时,只要页面可见,都自动刷新加载数据。如下图所示:

第一种情况:


第二种情况:


一,Viewpager+Fragment

这种模式下,是通过方法setUserVisibleHint进行控制fragment是否可见。其中,要调用mViewPager.setOffscreenPageLimit(2); 缓存两个页面,防止切换时销毁fragment

/** * viewpager切换时调用,而且是在onCreateView之前调用 * @param isVisibleToUser true:用户可见 */@Overridepublic void setUserVisibleHint(boolean isVisibleToUser) {    super.setUserVisibleHint(isVisibleToUser);    if (isVisibleToUser) {        isVisible = true;        onVisible();    } else {        isVisible = false;        onInVisible();    }}
        private void onVisible() {        if (isFirst && isVisible) {            onLazyLoad();//            isFirst = false; // 控制fragment可见时,是否自动加载数据。        }    }    /**     * fragment可见时再加载数据     */    public abstract void onLazyLoad();

其中的onLazyLoad方法在子类实现数据的加载。


二,FragmentTransaction.show(fragment)

这种情况和上面的有所不同,调用的方法是onHiddenChanged。

/** * 使用add(), hide()show()添加fragment * 刚开始add()时,当前fragment会调用该方法,但是目标fragment不会调用; * 所以先add()所有fragment,即先初始化控件,但不初始化数据。 * * @param hidden */@Overridepublic void onHiddenChanged(boolean hidden) {    super.onHiddenChanged(hidden);    if (!hidden) {        isVisible = true;        onVisible();    } else {        isVisible = false;        onInVisible();    }}

好了,源码地址https://github.com/XYScience/DelayFragment


    本人水平有限, 如有错误, 欢迎指正, 以免误导他人奋斗

1 0
原创粉丝点击