ViewPager之Adapter

概述

在讲Adapter之前 我们先来看看官方对ViewPager的Adapter 的解释。
这里写图片描述
我相信 这简单的English就不用我解释了吧,我们来看一下PagerAdapter的两个子类FragmentPagerAdapter和FragmnetStatePagerAdapter的区别。

区别

FragmentPagerAdapter和FragmentStatePagerAdapter:
FragmentPagerAdapter:对于不再需要的fragment,选择调用detach方法,仅销毁视图,并不会销毁fragment实例。
FragmentStatePagerAdapter:会销毁不再需要的fragment,当当前事务提交以后,会彻底的将fragmeng从当前Activity的FragmentManager中移除,state标明,销毁时,会将其onSaveInstanceState(Bundle outState)中的bundle信息保存下来,当用户切换回来,可以通过该bundle恢复生成新的fragment,也就是说,你可以在onSaveInstanceState(Bundle outState)方法中保存一些数据,在onCreate中进行恢复创建。
如上所说,使用FragmentStatePagerAdapter当然更省内存,但是销毁新建也是需要时间的。一般情况下,如果你是制作主页面,就3、4个Tab,那么可以选择使用FragmentPagerAdapter,如果你是用于ViewPager展示数量特别多的条目时,那么建议使用FragmentStatePagerAdapter。

方法解读

public Object instantiateItem(ViewGroup container, int position),初始化ViewPager的每个Item时候调用,在这里可以做Item的一些初始化操作。

@Override  
public Object instantiateItem(ViewGroup container, int position) {  
    View view = mViews.get(position);  //mView集合中存储的是当前所有的页面
    if (view == null) {  
        view = newView(position);  
        mViews.put(position, view);  
    }  
    container.addView(view);  
    return view;  
}

public void destroyItem(ViewGroup container, int position, Object object),销毁Item时候的调用。

@Override  
public void destroyItem(ViewGroup container, int position, Object object) {  
        container.removeView(mViews.get(position));  
    }  

public int getCount(),返回的是Item的总数。

@Override  
public int getCount(){  
       return mViews.size(); 
    }  

public boolean isViewFromObject(View view, Object object),返回当前的对象是不是View,也就是说是当前的Item应该是一个视图,官方建议 return view == object。

 @Override
 public boolean isViewFromObject(View view, Object object) {
           return view == object;
       }

讲了这四个基本的方法之后,我们再来讲一下其他的几个方法。
public void setPrimaryItem(ViewGroup container, int position, Object object),这个方法似乎都不怎么用,他是用来干什么的呢?,官方这样解释:“Called to inform the adapter of which item is currently considered to be the “primary”, that is the one show to the user as the current page.”意思就是说当前展现给用用户的Item,这个方法在每次viewpager滑动后都会被调用 而 object参数就是显示的Fragment ;

@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
  currentFragment = (TabFragment) object;
  super.setPrimaryItem(container, position, object);
}

public CharSequence getPageTitle(int position),继续看官方解释,“This method may be called by the ViewPager to obtain a title string to describe the specified page. This method may return null indicating no title for this page. The default implementation returns null.”就是返回当前的Item的描述。怎么处理?在XML文件中添加ViewPager的孩子PagerTabStrip 或者PagerTitleStrip,区别是PagerTabStrip 可点击切换。具体例子,在这里不详细解释,自己可以试着弄一下。
public void finishUpdate(ViewGroup container),官方“Called when a change in the shown pages is going to start being made
public void startUpdate(View container),官方“Called when the a change in the shown pages has been completed. At this point you must ensure that all of the pages have actually been added or removed from the container as appropriate.”,这两个方法一看是不是就知道可以做切换时的动画处理了,哈哈哈。

总结

这次似乎都叫大家看官方解释了,这也提醒我们一点,多看官方文档,其实也不是很难,ViewPager的Adapter里面的方法其实还是比较简单的,大家可以去看看,加油!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值