关于PagerAdapter的instantiateItem方法的执行次数

转载 2016年05月30日 16:41:54

之前以为ViewPager每次滑动都会调用instantiateItem,后来做项目时发现有时滑动时并不执行写在instantiateItem中的一些更新操作。于是写了个demo测试一下,代码如下:

public class MainActivity extends Activity { 
  ViewPager pager;
  List<View> views;
  @Override
  protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    pager = (ViewPager)findViewById(R.id.view_pager); 
    views = new ArrayList<View>();
    LayoutInflater mLi = LayoutInflater.from(this); 
    View view1 = mLi.inflate(R.layout.view1, null);
    View view2 = mLi.inflate(R.layout.view2, null); 
    View view3 = mLi.inflate(R.layout.view3, null); 
    views.add(view3); 
    views.add(view2);
    views.add(view1); 
    MyPagerAdapter adapter = new MyPagerAdapter(); pager.setAdapter(adapter);
  } 
  class MyPagerAdapter extends PagerAdapter{ 
    @Override public int getCount() {
       return views.size(); 
      } 
    @Override
    public boolean isViewFromObject(View arg0, Object arg1) { 
      return arg0 == arg1; //这行代码很重要,它用于判断你当前要显示的页面
      }
    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 
      container.addView(views.get(position));
      Log.d("tag",String.valueOf(position));
      return views.get(position); 
    } 
    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
      container.removeView(views.get(position)); 
    }
  } 
} 
}

运行时,当我进入第一页时,log打印 0和1,当我滑到第二页时,log打印2,,当我滑到第三页时,log没有输出信息。

所以我觉得是这样的。因为pagerAdapter是默认预加载前后一张的,所以当加载第一页时。调用了两次instantiateItem方法,第一次是加载本来的第一页,第二次是预加载第二页,所以log打印了0和1。可是显示的本来加载的第一页。当滑动到第二页时,只调用了一次instantiateItem方法,是因为本页已经在之前预加载过了,没有再调用instantiateItem方法也就是log不会再打印1,而是直接从ViewGroup中直接取出第二页用于显示。然后进行预加载第三页,所以这里会调用instantiateItem方法并打印2.接着滑动到第三页,由于第三节页也已经预加载过了,所以只是从ViewGroup取出第三页显示而不调用instantiateItem。但是由于预加载默认是前后一张,所以这时会从ViewGroup中取出第一页销毁。直到从第三页滑到第二页时才会再预加载第一页。

ViewGroup

转载:http://www.68idc.cn/help/buildlang/ask/20150112168627.html

viewpager之适配器instantiateItem()和destroyItem()的执行顺序

最新在整理viewpager,发现一骗很不错的文章,推荐给大家http://blog.csdn.net/harvic880925/article/details/38487149 看了之后发现一个问题...
  • sinat_29874521
  • sinat_29874521
  • 2016年10月20日 10:12
  • 2867

关于PagerAdapter的instantiateItem方法

之前以为ViewPager每次滑动都会调用
  • franket268
  • franket268
  • 2014年08月08日 15:51
  • 18930

理解PagerAdapter的instantiateItem()方法

在为ViewPager设置Adapter时肯定会用到PagerAdapter,Google Android文档对该类的定义如下: Base class providing the adapter...
  • KO_159
  • KO_159
  • 2016年03月16日 22:45
  • 769

android viewpager instantiateItem方法的position参数

今天无意间怎么写了这么一行代码呢? 然后自己左滑右滑position的数值都不是自己期望的那么变化。。。 在网上找了找,原来是介个样纸: 好好学习。天天向上。...
  • u010695380
  • u010695380
  • 2015年04月17日 19:09
  • 3787

Android - ViewPager使用PagerAdapter,instantiateItem时出现IndexOutOfBoundsException

这个问题困扰我有一个礼拜了、今天终于解决之、      感谢:http://stackoverflow.com/questions/9402970/android-viewpager-throwin...
  • cw2004100021124
  • cw2004100021124
  • 2015年06月05日 11:26
  • 1581

ViewPager 详解(二)---详解四大函数

前言:上篇中我们讲q
  • harvic880925
  • harvic880925
  • 2014年08月11日 09:29
  • 88224

关于PagerAdapter的instantiateItem方法

在为ViewPager设置Adapter时肯定会用到PagerAdapter,Google Android文档对该类的定义如下: Base class providing the adapter t...
  • weijinqian0
  • weijinqian0
  • 2016年07月05日 14:12
  • 627

关于PagerAdapter的instantiateItem方法

 关于PagerAdapter的instantiateItem方法,有需要的朋友可以参考下。 之前以为ViewPager每次滑动都会调用instantiateItem,后来做项目时发现有时...
  • ywb201314
  • ywb201314
  • 2015年05月29日 19:30
  • 745

Android ViewPager使用详解

这是谷歌官方给我们提供的一个兼容低版本安卓设备的软件包,里面包囊了只有在安卓3.0以上可以使用的api。而viewpager就是其中之一利用它,我们可以做很多事情,从最简单的导航,到页面菜单等等。那如...
  • wangjinyu501
  • wangjinyu501
  • 2012年11月10日 21:34
  • 346909

ViewPager报UnsupportedOperationException: Required method instantiateItem was not overridden错误

写一个简单的viewpager出现了下面这个报错信息。提示我们需要重写 instantiateItem方法:解决问题:adapter里边重写instantiateItem方法并改为如下所示。publi...
  • L_XING_ZHI
  • L_XING_ZHI
  • 2017年06月27日 14:34
  • 690
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于PagerAdapter的instantiateItem方法的执行次数
举报原因:
原因补充:

(最多只允许输入30个字)