这篇文章讲述一些有关于Viewpager的使用
要实现Viewpager,需要两块内容 一个PageAdapter 和监听事件OnPageChangeListener
PageAdapter
ViewPager其实跟ListView差不多 都是通过适配器Adapter来完成布局的
private ViewPager mPager;
mPager = (ViewPager) findViewById(R.id.vPager);
mPager.setAdapter(new MyPagerAdapter(listViews));
public class MyPagerAdapter extends PagerAdapter {
public List<View> mListViews;
public MyPagerAdapter(List<View> mListViews) {
this.mListViews = mListViews;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(mListViews.get(position));
}
@Override
public int getCount() {
return mListViews.size();
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(mListViews.get(position));
return mListViews.get(position);
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view==object;
}
}
这是最简单的实现方式, mListViews是包含V多个iew的一个List
其中必须实现的方式是有四个
getCount()
获取mListViews的长度 返回一个size就行了
isViewFromObject
判断传过来的view是不是object类型的 基本都是view==object
destroyItem
instantiateItem
下面本篇的重点来了
destroyItem和instantiateItem一个是添加view,一个是删除view,所以只讲instantiateItem
public Object instantiateItem(ViewGroup container, int position) {
container.addView(mListViews.get(position));
return mListViews.get(position);
}
instantiateItem 传进来一个ViewGroup 也就是容器,还有一个position是位置。 viewGroup指的就是调用instantiateItem方法的父view 也就是mPages,而position是指的是点击事件的位置。这个位置具体是怎么获取的呢,其实很简单,将所有的view做成一个list,然后onTouch事件响应点击的位置,再将list中这个位置的索引传过来就行了。
container.addView(mListViews.get(position));
在父View中添加子View
查看源码你会发现,所谓的子View也只是一个ItemInfo的对象
ItemInfo addNewItem(int position, int index) {
ItemInfo ii = new ItemInfo();
ii.position = position;
ii.object = mAdapter.instantiateItem(this, position);
ii.widthFactor = mAdapter.getPageWidth(position);
if (index < 0 || index >= mItems.size()) {
mItems.add(ii);
} else {
mItems.add(index, ii);
}
return ii;
}
ItemInfo的静态对象
static class ItemInfo {
Object object;
int position;
boolean scrolling;
float widthFactor;
float offset;
}
其实说白了,添加一个view 和添加一个对象差不多吧,只是封装的数据不一样,调用的方法换了个名字而已。