PagerAdapter是一个抽象类,是ViewPager对应的适配器的基类。当我们需要为viewPager自定义适配器的时候,我们一般都需要继承PagerAdapter,重写几个常用的方法,就可以实现我们需要的功能了。下面总结一下继承PagerAdapter需要重写下面几个方法。
1.public ObjectinstantiateItem(ViewGroupcontainer, int postion)
方法描述:根据postion来创建页面view,并将这个页面view添加到container中去。
参数描述:container->用于显示页面的容器,这里就是指ViewPager的对象;
position ->将要创建的页面view的下标;
返回值描述:一般返回的是刚刚生成的view,但是这不是强制要求的,也可以返回view的子view或者是与view相关的tag,这个tag可能就是positoin;根据我们的经验这与Adapter中的getView()方法类似,而在getView()方法中经常有这么一句代码,View view = LayoutInflater.from(context).inflater(R.id.xx,null);
Object o = list.get(position);
view.setTag(o);//将view对应的引用数据与view进行绑定;
这个o就是tag;
2.public booleanisViewFromObject(View view ,Object object);
方法描述:判断ViewPager中的某一个页面是否与给定的object存在联系;参数参数描述:view->需要进行判断的页面;
参数描述:object->需要进行判断的返回对象,注意,这里object就是instantiateItem返回的object;
返回值描述:如果存在就返回true,不相关就返回false;
难点:如何填充这个方法体?
这里的object就是instantiateItem返回的。所以如果你的instantiateItem返回的是整个页面view,那么就这么写:return view ==(View) object;
如果你返回的是当前的位置tag,那么就这么写:
objectr tag =view.getTag;
return tag == object;
3.public voiddestroyItem(ViewGroup container, int position, Object object)
方法描述:viewPager做了相关的缓存机制,所以当滑过一定数量的屏幕时,有些不可见的页面view将被销毁,这个时候就调用这个方法。
参数描述: container ->即将被销毁的页面view对应的容器,也就是ViewPager;
position->即将被销毁的页面view对应的下标;
object->即将被销毁的页面view对应的object;
方法体一般这么写:
((ViewPager)container).removeView((View) object);由这句代码可以知道instantiateItem返回的是页面view;
4.public int getCount();
方法描述:所有需要要创建的页面的数量;
5.public void finishUpdate(ViewGroup container)
方法描述:当前显示的页面被更新时就会调用这个方法,反过来说如果这个方法被调用了那么说明某些页面已经被添加或者删除
参数描述:container->用于显示adpater 中的页面view,即viewPager;
6.public int getItemPosition(Objectobject);
方法描述:当viewPager判断当前页面object的位置改变时就会调用这个方法;
参数描述:object->代表一个页面,这个项目由上面的instantiateItem(view,int)得到。
返回值描述:正常而言返回值是改变后的值,它的范围是[0,getCount()],如果object的位置没有改变,那么返回值是POSITION_UNCHANGED,如果当前值已经不存在了,那么返回值是POSITION_NONE;
特别注意:如果我们在一个ViewPager需要删掉一个页面,然后调用其notifyDataSetChanged(),这时候instantiateItem是不会被调用的,也就是UI界面是不会刷新的。解决的思路是:
private boolean isDelete;
public void setDelete(){
isDelete = true;
}
public int getItemPosition(Objectobject) {
if(isDelete){
return POSITION_NONE
}
return super. getItemPosition(object);
}
public void finishUpdate(ViewGroup container){
super.finishUpdate(container)
isDelete = false;
}
每次调用notifyDataSetChanged()之前调用setDelete()方法,这样getItemPosition()返回的是POSITION_NONE,代表当前页面缺失了,这样就可以让PageAdapter刷新屏幕了。刷新完毕之后finishUpdate()将被执行,从而将isDelete的值进行还原。