关闭

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

标签: viewpager性能优化预加载
822人阅读 评论(0) 收藏 举报
分类:

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

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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:23160次
    • 积分:437
    • 等级:
    • 排名:千里之外
    • 原创:20篇
    • 转载:5篇
    • 译文:0篇
    • 评论:4条
    最新评论