ViewPager 基本介绍
ViewPager常用于页面切换,轮播图等效果,非常不错的android控件,下面记录下我的使用过程。
1、自动播放轮播图实现
1)ViewPagerAdapter的实现
(1)在ViewPagerAdapter的getCount()方法中返回Integer.MAX_VALUE,该方法将返回所包含的 Item总个数。
为了实现一种循环滚动的效果,返回了基本整型的最大值,这样就会创建很多的Item, 其实这并非是真正的无限循环。
(2)isViewFromObject(View view, Object object)返回view == object;
(3)destroyItem(ViewGroup container, int position, Object object)中销毁预加载以外的view对象, 会把需要销毁的对象的
索引位置传进来,就是position,因为ImageViewList图片是有限的几条,而position将会取到很大的值, 所以使用取
余数的方法来获取每一条数据项。
(4)instantiateItem()同上(3);
具体代码如下:
public class ViewPagerAdapter extends PagerAdapter {
private List<ImageView> mImageViewList;
public ViewPagerAdapter(List<ImageView> imageViewList) {
super();
this.mImageViewList = imageViewList;
}
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(mImageViewList.get(position % mImageViewList.size()));
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(mImageViewList.get(position % mImageViewList.size()));
return mImageViewList.get(position % mImageViewList.size());
}
}
2)在使用的界面中开启个线程做自动切换,具体代码如下:
new Thread(new Runnable() {
@Override
public void run() {
while (isLoop) {
handler.sendMessageDelayed(0, 1000)
}
}
}).start();
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
mViewPager.setCurrentItem(mViewPager.getCurrentItem() + 1);
}
};
2、自定义MyViewPager,实现嵌套ViewPager中的内部ViewPager能获取手势处理
1)在onInterceptTouchEvent()中返回true,使当前ViewPager中onTouchEvent获取事件处理
2)在onTouchEvent()中事件中加入getParent().requestDisallowInterceptTouchEvent(true);告诉父控件自己处理。
具体代码如下:
@Override
public boolean onTouchEvent(MotionEvent arg0) {
switch (action) {
case MotionEvent.ACTION_DOWN:
if (getParent() != null) {
getParent().requestDisallowInterceptTouchEvent(true);
}
break;
case MotionEvent.ACTION_MOVE:
if (getParent() != null) {
getParent().requestDisallowInterceptTouchEvent(true);
}
}
return super.onTouchEvent(arg0);
}
3、ViewPager滑动事件
1)实现OnPageChangeListener接口,OnPageChangeListener这个接口需要实现三个方法:
(onPageScrollStateChanged,onPageScrolled,onPageSelected)
(1)onPageScrollStateChanged(int arg0),此方法是在状态改变的时候调用,arg0这个参数有三种状态(0,1,2)。
arg0 ==1的时辰默示正在滑动,
arg0 ==2的时辰默示滑动完毕了,
arg0 ==0的时辰默示什么都没做。
当页面开始滑动的时候,三种状态的变化顺序为(1,2,0),
(2)onPageScrolled(int arg0,float arg1,int arg2),当页面在滑动的时候会调用此方法,在滑动被停止之前,
此方法回一直得到调用。其中三个参数的含义分别为:
arg0 :当前页面,及你点击滑动的页面
arg1:当前页面偏移的百分比
arg2:当前页面偏移的像素位置
(3)onPageSelected(int arg0):此方法是页面跳转完后得到调用,arg0是你当前选中的页面的Position(位置编号)。
4、使用viewpager动态添加页面或者删除页面时出现了问题(Java.lang.IllegalStateException:
The specified child already has a parent. You must call removeView() on thechild's parent first),
解决办法是在instantiateItem中使用如下方式:
ViewGroup parent = (ViewGroup) v.getParent();
if (parent != null) {
parent.removeAllViews();
}
container.addView(v);