系列文章:
- ViewPager 详解(一)——基本入门
- ViewPager 详解(二)——四大函数
- ViewPager 详解(三)——PagerTabStrip与PagerTitleStrip添加标题栏
- ViewPager 详解(四)——自主实现滑动指示条X
- ViewPager 详解(五)——使用Fragment实现ViewPager滑动
pageradapter四大函数
每个滑动页面都对应一个Key,而且这个Key值是用来唯一追踪这个页面的,也就是说每个滑动页面都与一个唯一的Key一一对应
destroyItem()
该方法实现的功能是移除一个给定位置的页面。适配器有责任从容器中删除这个视图。这是为了确保在finishUpdate(viewGroup)返回时视图能够被移除
@Override
public void destroyItem(ViewGroup container, int position,
Object object) {
// TODO Auto-generated method stub
container.removeView(viewList.get(position));
}
getCount ()
返回当前有效视图的个数
@Override
public int getCount() {
// TODO Auto-generated method stub
return viewList.size();
}
instantiateItem (ViewGroup container, int position)
这个函数的实现的功能是创建指定位置的页面视图。适配器有责任增加即将创建的View视图到这里给定的container中,这是为了确保在finishUpdate(viewGroup)返回时this is be done!
返回值:返回一个代表新增视图页面的Object(Key),这里没必要非要返回视图本身,也可以这个页面的其它容器。其实我的理解是可以代表当前页面的任意值,只要你可以与你增加的View一一对应即可,比如position变量也可以做为Key
在代码中,我们的责任是将指定position的视图添加到conatiner中
该函数返回值就是我们根据参数position增加到conatiner里的View的所对应的Key
在 finishUpdate(viewGroup)执行完后,有两个操作,一个是原视图的移除(不再显示的视图),另一个是新增显示视图(即将显示的视图)
@Override
public Object instantiateItem(ViewGroup container, int position) {
// TODO Auto-generated method stub
container.addView(viewList.get(position));
return viewList.get(position);
}
};
在这里,我们做了两件事
第一:将参数里给定的position的视图,增加到conatiner中,供其创建并显示
第二:返回当前position的View做为此视图的Key。还记得API官方文档中下面这段话么?
对于非常简单的pageradapter或许你可以选择用page本身作为键,在创建并且添加到viewgroup后instantiateItem方法里返回该page本身即可destroyItem将会将该page从viewgroup里面移除。isViewFromObject方法里面直接可以返回view == object
这里就把当前的View当作Key传过出去
isViewFromObject (View view, Object object)
功能:该函数用来判断instantiateItem(ViewGroup, int)函数所返回来的Key与一个页面视图是否是代表的同一个视图(即它俩是否是对应的,对应的表示同一个View)
返回值:如果对应的是同一个View,返回True,否则返回False
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
// TODO Auto-generated method stub
return arg0 == arg1;
}
由于在instantiateItem()中,我们作为Key返回来的是当前的View,所以在这里判断时,我们直接将Key与View看是否相等来判断是否是同一个View
自定义Key实例
public class MainActivity extends Activity {
private View view1,view2,view3;
private ViewPager viewPager;
private List<View> viewList;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewPager = (ViewPager)findViewById(R.id.viewpager);
LayoutInflater layoutInflater = getLayoutInflater();
view1 = layoutInflater.inflate(R.layout.layout1,null);
view2 = layoutInflater.inflate(R.layout.layout2,null);
view3 = layoutInflater.inflate(R.layout.layout3,null);
viewList = new ArrayList<View>();
viewList.add(view1);
viewList.add(view2);
viewList.add(view3);
PagerAdapter pagerAdapter = new PagerAdapter() {
@Override
public boolean isViewFromObject(View view, Object object) {
//return view == object;
//根据传来的key,找到view,判断与传来的参数View view是不是同一个视图
return view == viewList.get((int)Integer.parseInt(object.toString()));
}
@Override
public int getCount() {
return viewList.size();
}
@Override
public void destroyItem(ViewGroup container, int position,
Object object) {
container.removeView(viewList.get(position));
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(viewList.get(position));
//return viewList.get(position);
return position;
}
};
viewPager.setAdapter(pagerAdapter);
}
}
改动了两个地方
1、先看Key的产生的位置instantiateItem()
@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(viewList.get(position));
//return viewList.get(position);
return position;
}
};
我们在上讲也讲了在这个函数中Key是作为返回值与当前装入Container中的视图对应起来的。所以在这里我们返回postion与container.addView(viewList.get(position));里的viewList.get(position)这个视图对应起来
2、isViewFromObject ()
@Override
public boolean isViewFromObject(View view, Object object) {
//return view == object;
//根据传来的key,找到view,判断与传来的参数View view是不是同一个视图
return view == viewList.get((int)Integer.parseInt(object.toString()));
}
判断从instantiateItem()返回来的Key与当前的View是否能对应起来,我们知道从instantiateItem传过来的其实是position,所以我们要根据position找到View,然后跟参数中的View view判断
但在真正操作时出现了问题,我们要先将obect对应转换为int类型:(int)Integer.parseInt(object.toString());然后再根据position找到对应的View
总结自:启航大神的博客http://blog.csdn.net/harvic880925/article/details/38487149