关闭

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

标签: viewpager性能优化预加载
1050人阅读 评论(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

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

1
0
查看评论

ViewPager(改好的源码,防止预加载)

package com.srm.base;/* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License&...
  • dingxiong0802
  • dingxiong0802
  • 2017-02-10 16:19
  • 253

ViewPager+Fragment取消预加载功能

在大多数项目中,在用到viewpager的时候一般也会配合使用fragment,viewpager中的预加载功能也是非常的好用,在大多数情况下,预加载提高了用户体验,在切换的时候会非常的流畅,but!任何事都有but~ 当每个fragment都需要去联网加载网络数据或者做一些耗时的操作,而且有其他...
  • LuckChouDog
  • LuckChouDog
  • 2016-04-21 10:47
  • 940

ViewPager+Fragment取消预加载

取消预加载是取消数据的预加载;我们可以预加载View 但是不加载数据,在Fragment显示的时候才去加载数据。 @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(s...
  • zshc123
  • zshc123
  • 2017-11-22 20:00
  • 16

ViewPager+Fragment取消预加载(延迟加载)

在项目中,都或多或少地使用的Tab布局,所以大都会用到ViewPager+Fragment,但是Fragment有个不好或者太好的地方。例如你在ViewPager中添加了三个Fragment,当加载ViewPager中第一个Fragment时,它会默认帮你预先加载了第二个Fragment,当你加载第...
  • hyq912
  • hyq912
  • 2015-01-12 16:45
  • 13421

ViewPager+Fragment如何取消预加载

本文主要介绍ViewPager+Fragment如何取消预加载,请看文章!
  • itluochen
  • itluochen
  • 2016-11-16 12:54
  • 304

Fragment+Viewpager 取消懒加载/预加载

前言几乎每个APP都会使用Fragment+ViewPager来实现多个界面的切换。相信用过Fragment+ViewPager来实现这种需求的时候,选中当前的Fragment的时候,系统会默认加载该Fragment左右两边的Fragment。也就是我们常说的懒加载或者预加载。预加载机制懒加载的机制...
  • Alpha58
  • Alpha58
  • 2017-06-13 23:20
  • 871

ViewPager+Fragment取消预加载(延迟加载)

在项目中,都或多或少地使用的Tab布局,所以大都会用到ViewPager+Fragment,但是Fragment有个不好或者太好的地方。例如你在ViewPager中添加了三个Fragment,当加载ViewPager中第一个Fragment时,它会默认帮你预先加载了第二个Fragment,当你加载第...
  • feitian145623
  • feitian145623
  • 2016-06-02 09:12
  • 172

fragment 懒加载 viewpager 取消预加载

ViewPager在设计的时候有一个预加载的机制,也就是如果你处于当前这个page界面时,会预先加载下一个page。但是有的时候设计到网络请求,就需要取消掉这个预加载。 setOffscreenPageLimit()这一个方法是设置预加载的个数,默认为1,但是当你设置为0的时候也会强行将它设置为...
  • u012971339
  • u012971339
  • 2016-02-29 13:37
  • 2055

viewPager+fragment取消预加载+及每次加载都要求请求

viewPager+fragment 的代码我就不写了 其他都能搜索的到 某一个fragment 类中 private boolean init; // 成员变量 控制其加载数据的的变量 public void setUserVisibleHint(boolean is...
  • androidforme
  • androidforme
  • 2015-09-02 16:57
  • 1631

ViewPager+Fragment setUserVisibleHint取消预加载(延迟加载)

在项目中,都或多或少地使用的Tab布局,所以大都会用到ViewPager+Fragment,但是Fragment有个不好或者太好的地方。例如你在ViewPager中添加了三个Fragment,当加载ViewPager中第一个Fragment时,它会默认帮你预先加载了第二个Fragment,当你加载第...
  • newsa
  • newsa
  • 2016-02-19 09:07
  • 1835
    个人资料
    • 访问:63619次
    • 积分:1544
    • 等级:
    • 排名:千里之外
    • 原创:64篇
    • 转载:229篇
    • 译文:0篇
    • 评论:5条