`

PagerAdapter的用法

 
阅读更多

官方英语原文地址:http://developer.android.com/reference/android/support/v4/view/PagerAdapter.html

(它是)基类,它提供适配器,该适配器能填充页面内容到ViewPager中。
你可能更喜欢使用它的特殊实现类,比如:FragmentPagerAdapter 或FragmentStatePagerAdapter

当你实现一个PageAdapter的时候,你至少必须要重载(override)下面几个方法:
· instantiateItem(ViewGroup, int)--实例化条目
· destroyItem(ViewGroup, int, Object)--销毁条目
· getCount()--获取条目数量
· isViewFromObject(View, Object)

PagerAdapter,比AdapterViews所使用的适配器,更常用。
在更新过程中,ViewPager使用回调(callbacks),来指示到哪一步了,而不是提供一套View直接回收的机制。
如果需要的话,PagerAdapter可以实现一种View回收机制,或者使用一个更加复杂的方法,来管理page view,
例如,Fragment的处理方式:每个页面都由它自己的Fragment来展现。

ViewPager都关联一个key对象,而不是直接与Views关联。
这个key用来跟踪并唯一标识指定的页面,它独立于其在适配器中的位置。
对PagerAdapter的startUpdate(ViewGroup)方法的一次调用,标志着ViewPager的页面内容即将改变。
随后,会调用若干次instantiateItem(ViewGroup, int) 或destroyItem(ViewGroup, int, Object)
最后,会调用 finishUpdate(ViewGroup),这意味着本次更新将要结束了。
等到finishUpdate返回时,与instantiateItem返回的key对象关联的view,应该被添加到其父控件ViewGroup中了,
而与传递给destroyItem 的这些key关联的view,应该被移除了。
isViewFromObject(View, Object)方法用于判断某个view是否与key对象关联。

一个简单的PagerAdapter,可以用page Views本身当为key对象;
创建并添加到ViewGroup中后,可以instantiateItem(ViewGroup, int)中返回它;
对应的destroyItem(ViewGroup, int, Object)的实现,从父控件ViewGroup中删除它;
isViewFromObject(View, Object) 可以这样实现:return view == object;.

PagerAdapter支持数据集(data set)的变更更新。
但数据集变更,必须发生在主线程中,并且最后要调用notifyDataSetChanged()方法,
这点与从BaseAdapter派生的AdapterView的适配器,很相似。
数据集的改变,可以包含pages的添加,删除或位置改变。
ViewPager将保持当前的页面处于active状态,它由实现了getItemPosition(Object)方法的适配器提供。

public Object instantiateItem (ViewGroup container, int position)
在指定的位置创建页面;适配器负责添加view到这个容器中,然而它只保证在finishUpdate(ViewGroup)返回时才完成。
public void destroyItem (ViewGroup container, int position, Object object)
删除指定位置的页面;适配器负责从view容器中删除view,然而它只保证在finishUpdate(ViewGroup)返回时才完成。
public abstract int getCount ()
返回可用的view的数量。
public abstract boolean isViewFromObject (View view, Object object)
判断页面是否跟指定的key对象关联,key对象由instantiateItem(ViewGroup, int)返回。

ViewPager源码,你去看下addNewItem方法,会找到instantiateItem的使用方法,注意这里的mItems变量。然后你再搜索下isViewFromObject,会发现其被infoForChild方法调用,返回值是ItemInfo。再去看下ItemInfo的结构,其中有一个object对象,该值就是instantiateItem返回的。

也就是说,ViewPager里面用了一个mItems(ArrayList)来存储每个page的信息(ItemInfo),当界面要展示或者发生变化时,需要依据page的当前信息来调整,但此时只能通过view来查找,所以只能遍历mItems通过比较view和object来找到对应的ItemInfo。

简单的说就是PageView有个私有属性private final ArrayList<ItemInfomItems = new ArrayList<ItemInfo>();当调用addNewItem(int,int)时

   void addNewItem(int position, int index){
           ItemInfo ii = new ItemInfo();
           ii.position = position;
           ii.object = .instantiateItem(this, position);
           if (index < 0) {
               .add(ii);
           } else {
              .add(index, ii);
           }
}
会调用.instantiateItem(this, position),将返回值保存到ItemInfo并将此ItemInfo保存到mItem中,当界面要展示或者发生变化时,需要依据中找到保存的ItemInfo信息来调整页面,但此时只能通过view来查找,所以只能遍历mItems通过比较view和object来找到对应的ItemInfo。
   ItemInfo infoForChild(View child) {
              for (int i=0; i<.size(); i++) {
                   ItemInfo ii = .get(i);
                   if (.isViewFromObject(child, ii.object)) {
                      return ii;
                   }
              }
              return null;
      }

分享到:
评论

相关推荐

    详解Android App中ViewPager使用PagerAdapter的方法

    主要介绍了详解Android App中ViewPager使用PagerAdapter的方法,同时附带了一个ViewPager的PagerAdapter不能更新数据的问题解决方法,需要的朋友可以参考下

    android仿Adapter实现自定义PagerAdapter方法示例

    主要给大家介绍了关于android仿Adapter实现自定义PagerAdapter的相关资料,文中详细介绍了关于PagerAdapter的用法,对大家的理解和学习具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。

    详解Android开发技巧之PagerAdapter实现类的封装

    关于ViewPager + Fragment的使用,已经有FragmentAdapter的实现可以帮助我们快速进行开发了,但是每次使用ViewPager + View都要自己去继承PagerAdapter并实现,重写那些我们写过一次又一次的方法,于是决定对其进行...

    ViewPager用法

    博客地址:http://blog.csdn.net/dmk877/article/details/50060745,ViewPager中PagerAdapter的用法详解

    用于viewPager和Fragement制作滑动效果的自定义PagerAdapter

    用于viewPager和Fragement制作滑动效果的自定义PagerAdapte,用法请参考我写的博文《使用fragment控件制作左右滑动画廊和欢迎界面》

    LoopingViewPager:支持自动滚动,无限循环和页面指示符的ViewPager和PagerAdapter组合

    一个ViewPager和PagerAdapter可以: 自动滚动(开/关功能) 无限循环(具有开/关功能) 可调自动滚动间隔 如果只有一项,则不会滚动也不循环 与notifyDataSetChanged()一起很好地工作 支持页面指示器 支持不同...

    ViewPager中ViewPager的使用和Fragment适配器

    ViewPager中ViewPager的使用,如何处理触摸事件的冲突和Fragment适配器。

    Android使用ViewPager实现左右无限滑动

     网上有很多使用ViewPager实现左右滑动这一效果的资料,这些资料大多数都是将PagerAdapter中getCount()方法的返回值设为Integer.MAX_VALUE使用户看不到边界,然后在instantiateItem()方法中通过position%(要循环...

    LoopingViewPager

    您可以将其与“ PagerAdapter ” PagerAdapter (使用Views PagerAdapter寻呼机), 但你也可以使用FragmentPagerAdapter它允许你以填补寻呼机Fragments ! ViewPager实际上将创建2个其他视图/片段来伪造无限循环...

    AndroidViewPager使用详解

    这是谷歌官方给我们提供的一个兼容低版本安卓设备的软件包,里面包囊了只有在安卓3.0以上可以使用的api。...在Activity里实例化ViewPager组件,并设置它的Adapter(就是PagerAdapter,方法与ListView一样的),在这

    viewPager循环广告位实现

    viewpager的使用方法 1. 实现一个PagerAdapter的子类MyPagerAdapter。 2. 实现里面的4个方法。 3. getCount()返回当前的viewpager里面有几页。 4. isViewFromObject()内部优化的逻辑 return view == object; 5....

    Android中ViewPager组件的基本用法及实现图片切换的示例

    ViewPager是android-support-v4.jar包里的组件。在布局文件里标签需要连包名一起 写全称 基本用法 ViewPager的基本用法我概括为三步 ...也是android.support.v4.view包里的,继承类需要实现四个方法

    Android中用RxJava和ViewPager实现轮播图

    前言 很多人要实现轮播图都会想到使用ViewPager + Handler来...在此我也就不对它的使用方法进行过多的介绍了。直接开始介绍轮播的方法。 常见的轮播操作 private class ImageAdapter extends PagerAdapter{ priva

    ViewPager 与 Fragment相结合实现微信界面实例代码

    在如今的互联网时代,微信已是一个超级... ViewPager的使用很简单,通过setAdapter()方法设置一个PagerAdapter即可,这个PagerAdapter需要自己写,实现里面的一些方法。本篇要和Fragment结合,所以实现的是FragmentPag

    MiUIIndicator:这是一个仿照MIUI的页面指示器,配合ViewPager使用,视觉效果很不错

    #AuthorWangjia55()Blog:#效果图:#使用方法也非常简单mPagerAdapter = new PagerAdapter(getSupportFragmentManager());mViewPager.setAdapter(mPagerAdapter);List mListTabs = Arrays.asList("短信", "收藏", ...

    Android项目源码蚌埠掌上校园学生项目.rar

    5、引用ViewPagerIndicator库,将viewpager和mIndicator关联起来,必须在viewpager设置完adapter后才能调用,重写PagerAdapter方法及自定义样式修改 6、下拉刷新和上拉加载更多,布局安排以及动画的设置。 7、三级...

    Android 掌上校园.zip

    将viewpager和mIndicator关联起来,必须在viewpager设置完adapter后才能调用,重写PagerAdapter方法及自定义样式修改 6、下拉刷新和上拉加载更多,布局安排以及动画的设置。 7、三级缓存 内存缓存:优先加载, 速度最...

    TabLayout标题文字不显示的解决操作

    问题描述: 使用Design包的TabLayout实现类似...不要为ViewPager手动使用addTab()方法添加标题,而应该先创建一个List集合,将其设置在PagerAdapter的getPageTitle方法中,代码如下: @Override public CharSequence

Global site tag (gtag.js) - Google Analytics