ViewPager关于PagerAdapter详解
关于PagerAdapter, Android 文档链接如下:
http://developer.android.com/intl/zh-cn/reference/android/support/v4/view/PagerAdapter.html
其中主要涉及如下四个方法:
- instantiateItem(ViewGroup, int) // 创建指定位置的页面视图。适配器有责任增加即将创建的View视图到这里给定的container中。
- destroyItem(ViewGroup, int, Object) // 该方法实现的功能是移除一个给定位置的页面。适配器有责任从容器中删除这个视图。这是为了 // 确保在finishUpdate(viewGroup)返回时视图能够被移除。
- getCount() // 返回当前有效视图的个数。
- isViewFromObject(View, Object) // 所返回来的Key与一个页面视图是否是代表的同一个视图(即它俩是否是对应的,对应的表示同一 // 个View)
文档中主要我们需要关心的内容翻译一下:
ViewPager不直接处理每一个视图而是将各个视图与一个键联系起来。这个键用来跟踪且唯一代表一个页面,不仅如此,该键还独立于该页面所在adapter中的位置。当PagerAdapter将要改变的时候会调用startUpdate(ViewGroup container)方法,接下来会调用一次或多次的 instantiateItem(ViewGroup, int)方法或者destroyItem(ViewGroup, int, Object)方法。最后在一个更新的后期会调用finishUpdate(ViewGroup)方法。当finishUpdate返回,instantiateItem返回的对象应该被添加到父ViewGroup中,而destroyItem中传入的对象应该从ViewGroup中删除。isViewFromObject(View, Object)方法表示当前的页面是否与给定的键相关联。
对于简单的PagerAdapter或许你可以选择用该view本身作为键,在创建并且添加到ViewGroup后,将该view从instantiateItem(ViewGroup, int)方法里返回。相对应的,在destroyItem(ViewGroup, int, Object)方法中将该view从ViewGroup里面移除。isViewFromObject(View, Object)方法里面直接可以返回view == object。
简单来说就是:
有一个key的概念,每个唯一的key关联到一个View,且这个key独立于该View所处在PagerAdapter中的位置。我们通过这个key来追踪一个View,即一个页面。通常,我们可以把这个View本身作为key。
常见PagerAdapter
利用View本身作为键
private static class MyAdapter extends PagerAdapter {
private List<View> viewList;
public MyAdapter(List<View> viewList) {
this.viewList = viewList;
}
@Override
public int getCount() {
return viewList.size();
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(viewList.get(position));
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
View view = viewList.get(position);
container.addView(view);
return view;
}
}
既然key是需要一个唯一的值,那么我们也可以从instantiateItem()返回一个position,因为position在这边也是唯一的,同时也与对应的View相关联。具体实现如下:
利用position作为键
private static class MyAdapter2 extends PagerAdapter {
private List<View> viewList;
private List<String> titleList;
public MyAdapter2(List<View> viewList, List<String> titleList) {
this.viewList = viewList;
this.titleList = titleList;
}
@Override
public int getCount() {
return viewList.size();
}
@Override
public boolean isViewFromObject(View view, Object object) {
// object即instantiateItem方法返回的position, 这里可以通过position从
// viewList中取出这个key对应的view
View viewFromKey = viewList.get((int)object);
return view == viewFromKey;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(viewList.get(position));
return position; // position 作为key
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(viewList.get(position));
}
@Override
public CharSequence getPageTitle(int position) {
return titleList.get(position);
}
}