Franco的博客

学习,整理,积累,站在巨人的肩膀上厚积薄发

ViewPager+Fragment连用取消预加载(ViewPagerIndicator+Fragment)

ViewPageIndicator的核心就是ViewPager,所以同样存在预加载的问题。

项目中经常会用到这样的tab切换,所以核心都会用到ViewPager+Fragment,那么会有个问题,在ViewPager中添加三个或多个Fragment,那么当ViewPager中第一个Fragment加载的时候,会加载第二个,甚至连第三个都会帮助加载好;这个功能很好但,很多时候当只需要第一个Fragment的时候会做很多多余的工作,增添网络请求压力。所以我们想要的一个效果切到那个Fragment再请求那些数据。

首先介绍两个Fragment的两个方法,也是很重要的方法void setUserVisibleHint(boolean isVisibleToUser)、boolean getUserVisibleHint()

setUserVisibleHint:该方法是在onCreate方法和onCreateView方法之间执行的一个方法,同时该方法是在Fragment显示的时候执行的,所以说通过这个方法可以做很多事。

getUserVisibleHint:获得Fragment的可见状态。

    import android.support.v4.app.Fragment;  
      
    public abstract class BaseFragment extends Fragment {  
          
        /** Fragment当前状态是否可见 */  
        protected boolean isVisible;  
          
          
        @Override  
        public void setUserVisibleHint(boolean isVisibleToUser) {  
            super.setUserVisibleHint(isVisibleToUser);  
              
            if(getUserVisibleHint()) {  
                isVisible = true;  
                onVisible();  
            } else {  
                isVisible = false;  
                onInvisible();  
            }  
        }  
          
          
        /** 
         * 可见 
         */  
        protected void onVisible() {  
            lazyLoad();       
        }  
          
          
        /** 
         * 不可见 
         */  
        protected void onInvisible() {  
              
              
        }  
          
          
        /**  
         * 延迟加载 
         * 子类必须重写此方法 
         */  
        protected abstract void lazyLoad();  
    }  

之后写Fragment就可以继承这个类来些,然而必须重写lazyLoad()方法,当Fragment对用户可见(也就是切换到该Fragment时)在lazyLoad()中加载所需数据;

下面摘一段代码,可以看一下怎么用

public class ActivityPageFragment extends BaseFragment{
//首先执行该方法
    @Override
    protected void lazyLoad() {
        if (!isVisible ) {
            return;
        }
//在这里对所需数据进行加载
        new LoadActivityListAsyncTask().execute(Const.REFRESH_INDEX);
        new PrizeListAsyncTask().execute();
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle
            savedInstanceState) {
        return inflater.inflate(R.layout.fragment_activity_page, container, false);
    }
类似这样写Fragment,在Fragment都写好后,还要在FragmentActivity中对ViewPager设置一下,让其每次只加载一个Fragment;

ViewPager.setOffscreenPageLimit(int limit),其中参数可以设为0或者1,参数小于1时,会默认用1来作为参数,未设置之前,ViewPager会默认加载两个Fragment。所以,我们只需要调用下它,设置下加载Fragment个数即可。

mViewPager = (ViewPager) findViewById(R.id.fl_tabcontent);
mViewPager.setOffscreenPageLimit(1);//关闭预加载,默认一次只加载一个Fragment

至此很简单主要就是这几行代码就关闭了预加载。

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/w372426096/article/details/49950869
个人分类: Android性能优化
上一篇SlidingMenu源码解析及简单应用案例
下一篇ViewPager中切换及滑动切换Fragment数据保存状态讲解
想对作者说点什么? 我来说一句

ViewPager+Fragment懒加载问题

2016年12月01日 150KB 下载

没有更多推荐了,返回首页

关闭
关闭