`

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_PagerAdapter使用

    在本篇文章中,我们将深入探讨 `PagerAdapter` 的使用方法及其在实际开发中的应用。 首先,我们了解 `PagerAdapter` 的基本概念。`PagerAdapter` 是一个接口,位于 `android.support.v4.view` 包下,它的主要职责是...

    pagerAdapter

    自定义`PagerAdapter`通常涉及`instantiateItem`和`destroyItem`方法的重写,以及使用`LayoutInflater`加载布局文件。开发者可以通过导入和学习示例项目来快速掌握`PagerAdapter`的用法,提高应用开发效率。

    viewpager + PagerAdapter刷新数据

    PagerAdapter是一个抽象类,你需要创建它的子类并实现其中的关键方法,如`instantiateItem()`、`destroyItem()`和`isViewFromObject()`等,以便为ViewPager提供页面视图。 1. **PagerAdapter的实现** - `...

    PagerAdapter

    `PagerAdapter`会根据这个方法的返回值来决定何时加载或销毁页面。 3. `instantiateItem(ViewGroup container, int position)`: 创建或恢复在给定位置的页面。这个方法默认会调用`getItem(int position)`,因此通常...

    在PagerAdapter添加GridView

    标题中的“在PagerAdapter添加GridView”指的是在Android开发中如何将GridView与PagerAdapter结合使用,以便在ViewPager中展示一个可滑动的GridView视图。这通常用于创建一个卡片式或页面式的浏览体验,用户可以通过...

    安卓视图效果相关-可以左右滑动的PagerAdapter分页图文视图.rar

    1. **PagerAdapter**:理解PagerAdapter的工作原理,如何重写`getCount()`、`instantiateItem(ViewGroup, int)`和`destroyItem(ViewGroup, int, Object)`等方法来管理页面的数量和生命周期。 2. **ViewPager**:...

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

    为了使用PagerAdapter,你需要创建一个新的类,直接继承自PagerAdapter,并实现其关键方法: 1. `public abstract int getCount();`: 这个方法返回ViewPager中页面的数量。根据你的数据源,你需要计算出需要展示的...

    PagerAdapter的应用实例

    3. **设置适配器**:使用`setAdapter()`方法将我们创建的PagerAdapter实例赋值给ViewPager。 4. **关联布局**:确保在布局文件中包含ViewPager,并为其指定一个ID。 5. **可选:设置PageTransformer**:如果需要...

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

    Android中的`PagerAdapter`是用于与ViewPager配合使用的适配器,它允许用户在多个视图之间进行滑动,常用于创建类似轮播图、标签页等交互界面。在本示例中,我们将探讨如何仿照Adapter实现自定义的PagerAdapter,以...

    引导页PagerAdapter

    开发者需要实现`PagerAdapter`中的方法,如`instantiateItem()`和`destroyItem()`,以填充和移除ViewPager的页面。`PagerAdapter`提供了基础的页面管理和生命周期管理功能。 `FragmentPagerAdapter`是`PagerAdapter...

    使用ViewPage+PagerAdapter做左右滑屏,As项目源码

    `PagerAdapter`需要实现`INfinitePagerAdapter`接口,其中包含`getCount()`(返回子视图数量)和`instantiateItem(ViewGroup, int)`(创建并添加子视图到`ViewPager`)等方法。 在实际项目中,使用`ViewPager`和`...

    PagerAdapter.zip

    首先,PagerAdapter是Android SDK中的一个抽象类,位于`android.support.v4.view`包下(如果使用的是AndroidX库,则位于`androidx.viewpager.widget`包下),它是ViewPager的数据适配器,用于为ViewPager提供页面...

    FragmentStatePagerAdapterDemo pagerAdapter的实现类

    在这个"FragmentStatePagerAdapterDemo"中,我们将深入探讨它的实现原理和使用方法。 首先,FragmentStatePagerAdapter 的主要优势在于它可以保存并恢复 Fragment 的状态。当用户在 ViewPager 中浏览时,只有当前...

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

    总的来说,封装PagerAdapter实现类是提高代码效率和减少重复工作的好方法,尤其是在频繁使用ViewPager与各种数据源结合的场景下。通过这种方式,开发者可以专注于业务逻辑,而不是基础的视图创建和管理。

    解决viewPagerAdapter数据不更新问题

    1. **正确实现`PagerAdapter`**:你需要确保你的`PagerAdapter`类(通常是`ViewPagerAdapter`或`FragmentPagerAdapter`)正确实现了`getItemPosition()`方法。这个方法告诉`ViewPager`某个项的位置是否改变,如果...

    ViewPager用法

    在本篇文章中,我们将深入探讨ViewPager的工作原理以及如何有效地使用PagerAdapter进行适配。 1. **ViewPager的基本概念** ViewPager本质上是一个可以容纳多个View的容器,每个View代表一个页面。用户可以通过水平...

    viewpager实现广告banner轮播

    这里,`MyPagerAdapter`需要继承自`PagerAdapter`,并重写`instantiateItem()`和`destroyItem()`方法,以提供页面实例和处理页面的创建与销毁。如果你的页面是`Fragment`,可以使用`FragmentPagerAdapter`或`...

Global site tag (gtag.js) - Google Analytics