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

之前以为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

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: PagerAdapter是Android中的一个抽象类,用于管理多个视图之间的切换。它是ViewPager的一个必需组件,用于在ViewPager中显示多个视图。PagerAdapter负责从数据集中获取每个页面的视图,并将其添加到ViewPager中。同时,PagerAdapter还管理视图的销毁和重建,以确保内存使用效率。PagerAdapter有几个具体的子类,包括FragmentPagerAdapter和FragmentStatePagerAdapter,它们分别用于管理Fragment和视图的切换。 ### 回答2: PagerAdapter是Android中的一个类,用于管理和显示多个界面,常用于TabLayout与ViewPager的结合中。它是PagerAdapter接口的实现类,实现了其中的方法PagerAdapter可以用于不同类型的界面切换,例如Fragment、View等。通过在PagerAdapter中重写getItem()方法,可以返回对应位置的界面对象。getPageTitle()方法可以返回每个界面的标题。 PagerAdapter有三个重要的方法:getCount()、instantiateItem()和destroyItem()。 getCount()方法返回ViewPager中所包含的界面数量。instantiateItem()方法用于实例化ViewPager中特定位置的界面,并将其添加到ViewPager中。destroyItem()方法用于销毁ViewPager中特定位置的界面。 PagerAdapter还提供了一些其他方法,如isViewFromObject()用于判断一个界面对象是否与当前视图相关联;getItemPosition()用于获取界面对象的位置;finishUpdate()用于完成界面的更新。 PagerAdapter可以根据需求进行自定义,实现不同的界面展示效果。例如,可以自定义PagerAdapter的子类,重写isViewFromObject()方法来实现判断不同界面是否相等的逻辑。 在使用PagerAdapter时,需要创建一个PagerAdapter的实例,并将其设置给ViewPager。然后,通过ViewPager.setCurrentItem()方法可以切换到指定位置的界面。 总而言之,PagerAdapter是Android中用于管理和显示多个界面的工具,可以实现界面切换、标题显示等功能,并且可以根据需求进行自定义。 ### 回答3: PagerAdapter 是 Android 中的一个适配器类,主要用于在 ViewPager 中展示多个页面。它是 PagerAdapter 类的子类,用于为 ViewPager 提供数据和视图。 PagerAdapter 提供了以下几种方法来管理 ViewPager 中的页面: 1. getCount() 方法:用于获取 ViewPager 中页面的总数。 2. instantiateItem() 方法:用于创建并返回指定位置的页面对象。 3. destroyItem() 方法:用于销毁指定位置的页面对象。 4. getPageTitle() 方法:用于获取指定位置页面的标题,用于设置 ViewPager 的标题。 5. isViewFromObject() 方法:用于判断指定的对象是否是页面的视图。 使用 PagerAdapter 主要包括以下几个步骤: 1. 创建一个继承 PagerAdapter 的自定义适配器类。 2. 实现适配器类中的 getCount() 方法,返回页面的总数。 3. 实现 instantiateItem() 方法,用于创建并返回指定位置的页面对象。 4. 实现 destroyItem() 方法,用于销毁指定位置的页面对象。 5. 实现 getPageTitle() 方法,用于设置页面的标题。 6. 实现 isViewFromObject() 方法,用于判断指定的对象是否是页面的视图。 7. 将适配器对象设置给 ViewPager。 通过以上步骤,我们就可以在 ViewPager 中展示多个页面,并可以自定义这些页面的数据和视图。通过滑动 ViewPager,我们可以切换不同的页面,从而实现了页面的左右滑动切换效果。PagerAdapter 在 Android 开发中被广泛应用于多个页面的展示场景,比如图片轮播、引导页等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值