Fragment懒加载

来源:互联网 发布:淘宝店铺网址怎么写 编辑:程序博客网 时间:2024/05/16 08:11

看了很多网上大神写的Fragment懒加载的代码,在此整理下。


先说下应用场景吧,当Fragment和Viewpager结合使用时 Viewpager同时加载多个Fragment实现多Tab的切换时,大量加载数据页面就会变得很卡顿。或者用户没用想着去浏览下一页的时候我们已经预加载好了内容。这样就造成了资源的浪费。非常影响用户体验。

 解决方案:通过Fragment实现可见后加载(懒加载)。这时我们就会 用到setUserVisibleHint 和getUserVisibleHint方法。


想看setUserVisibleHint 方法详情 传送门:http://blog.csdn.net/czhpxl007/article/details/51277319



首先初始化两个标志,是否可见标志和onActivityCreated是否执行标志

//是否可见标志protected boolean isVisible;//初始化完成标志protected boolean isPrepare;
提供一个是否执行懒加载的 方法isLazyLoad 

private void isLazyLoad(){    //当可见时,并且初始化完成时,加载数据    if(isPrepare && isVisible){        //默认只加载一次        isPrepare = false;        lazyLoad();    }}

/** * 如需懒加载,子类重写该方法 */protected void lazyLoad(){}

@Overridepublic void onActivityCreated(Bundle savedInstanceState) {    super.onActivityCreated(savedInstanceState);    isPrepare = true;    isLazyLoad();}

在onActivityCreated里改变为true,执行一次isLazyLoad。 (必须调用一次因为setUserVisibleHint )执行的比onActivityCreated初始化还要早,不调用会导致第一次进入数据空白


下面看setUserVisibleHint方法的操作

/** * 在这里实现Fragment数据的缓加载. * @param isVisibleToUser */@Overridepublic void setUserVisibleHint(boolean isVisibleToUser) {    super.setUserVisibleHint(isVisibleToUser);    //获取是否可见的状态    if(getUserVisibleHint()) {        //可见时把 isVisible置为true        isVisible = true;        //执行相应可见的方法        onVisible();    } else {        //可见时把 isVisible置为false        isVisible = false;        //执行相应不可见的方法        onInvisible();    }}

/** * 不可见 */protected void onInvisible(){}

可见时执行isLazyLoad();

/** * 可见 */protected void onVisible(){    isLazyLoad();}

这样懒加载就完了!可是默认只执行一次!那如果我们有执行多次的需要改怎么办呢?

那么我们再写一个刷新 isPrepare的方法!当执行完isLazyLoad的时候调用他。

/** * 设置再次进入是否需要刷新 * @param isRefresh 刷新标志 */protected void setRefresh(boolean isRefresh){    isPrepare = isRefresh;}


掉用的话就在lazyLoad中调用

@Overrideprotected void lazyLoad() {    Toast.makeText(getContext(),"==懒加载1==",Toast.LENGTH_SHORT).show();    //如需每次进入都刷新,则调用此方法    setRefresh(true);}




0 0