Fragment延迟加载

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

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

第一种情况:


第二种情况:


一,Viewpager+Fragment

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

/**
 * viewpager切换时调用,而且是在onCreateView之前调用
 * @param isVisibleToUser true:用户可见
 */
@Override
public 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
 */
@Override
public void onHiddenChanged(boolean hidden) {
    super.onHiddenChanged(hidden);
    if (!hidden) {
        isVisible = true;
        onVisible();
    } else {
        isVisible = false;
        onInVisible();
    }
}

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


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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值