ViewPager真正的无限轮播


前言:

ViewPager无限轮播功能,是指ViewPager轮播永远无法到头的功能.该功能是Android项目中一些比较常用的功能,我们在实现的时候,一般是通过设置ViewPager展示的个数是Integer.MAX_VALUE来搞定,有人提出这种方式不好,那我们来一起学习一种真正的轮播方式

请关注刘老师Android系列视频,里边有详细讲解
http://edu.csdn.net/course/detail/2741/44220

先亮出设置简单的实现代码

  • 1–在PagerAdapter中getCount方法中设置当前展示条目总个数
@Override
public int getCount() {
//设置为展示好多条目
return Integer.MAX_VALUE;
}
  • 2–在PagerAdapter中instantiateItem中展示条目信息
@Override
public Object instantiateItem(ViewGroup container, int position) {
//getView
View view = View.inflate(context, R.layout.vp_item, null);
ImageView imageView = (ImageView) view.findViewById(R.id.imageView);
TextView tv_title = (TextView) view.findViewById(R.id.tv_title);
// 0 1 2 3 4 5 6 7
// 0 1 2 3 0 1 2 3
//设置图片资源,设置时,由于图片索引值从0---Integer.MAX_VALUE,所以在这里进行索引%集合.size()
imageView.setImageResource(newsList.get(position%newsList.size()).getResId());
tv_title.setText(newsList.get(position%newsList.size()).getTitle());
//添加到容器中
container.addView(view);
return view;
}
  • 3–在Activity中设置初始页
//设置数据适配器
viewPager.setAdapter(new MyPagerAdapter(this, newsList));
//设置当前页码值--一开始就在某位置
viewPager.setCurrentItem(10000*newsList.size());

以上是使用一种方式来完成,这种方式在开发中常用,实际上可行,但是理论上是有问题,因为如果时间允许,总是可是滑动到头的,这种方式也被一些开发所诟病,下边来介绍另外一种方式,这种方式是对展示的集合进行操作,原理分析如下:

  • 在添加集合时,先往集合最前边添加最后一个条目,然后正常添加集合条目,再在最后边添加第一个条目,效果如图

这里写图片描述

  • 当进行轮播滑动时,如果滑动到第四个,再往下滑动,就会展示第一个条目信息(当前在图中条目1),然后这个时候,会不懂声色的将条目当前位置切换到图中1的位置,如此滑动,每到图中5位置时,都会讲当前位置切到图中1的位置…

  • 对于往左滑动,如果当前在图中1位置,再往左滑动,就会展示第四个条目信息,同时在这个位置将当前条目索引切换到索引值4位置处….

  • 经过上边的切换,对于四个条目的展示效果,是逢5变1,逢0变4,这样就永远无法滑动到头….
下边将代码贴出
  • 定义常量,指定要切换页码的索引值
private static final int FIRST_PAGE = 1;
  • 初始化数据,先往集合最前边添加最后一个条目,然后正常添加集合条目,再在最后边添加第一个条目
private void initData() {

newsList.add(new News("我是第四个美女", R.drawable.a3)); // 0

newsList.add(new News("我是第一个美女", R.drawable.a)); // 1
newsList.add(new News("我是第二个美女", R.drawable.a1)); // 2
newsList.add(new News("我是第三个美女", R.drawable.a2)); // 3
newsList.add(new News("我是第四个美女", R.drawable.a3)); // 4

newsList.add(new News("我是第一个美女", R.drawable.a)); // 5
}
  • 适配器中不做任何处理,正常写出
public class MyPagerAdapter extends PagerAdapter {
private Context context;
private ArrayList<News> newsList;

public MyPagerAdapter(Context context,ArrayList<News> newsList) {
this.context=context;
this.newsList=newsList;
}

@Override
public int getCount() {
return newsList.size();
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view==object;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
//getView
View view = View.inflate(context, R.layout.vp_item, null);
ImageView imageView = (ImageView) view.findViewById(R.id.imageView);
TextView tv_title = (TextView) view.findViewById(R.id.tv_title);
imageView.setImageResource(newsList.get(position).getResId());
tv_title.setText(newsList.get(position).getTitle());
//添加到容器中
container.addView(view);
return view;
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}

}
  • 对viewPager设置监听,在监听处理逻辑
// 设置viewPager的监听事件
viewPager.setOnPageChangeListener(new OnPageChangeListener() {
// 滑动状态改变的方法 state :draaging 拖拽 idle 静止 settling 惯性过程
@Override
public void onPageScrollStateChanged(int state) {
//如果是静止状态,将当前页进行替换 if(state==ViewPager.SCROLL_STATE_IDLE)
// 设置当前页,smoothScroll 平稳滑动 viewPager.setCurrentItem(currentPosition, false);
}
// 滑动过程中的方法 position 索引值
// positionOffset 0-1
// positionOffsetPixels 偏移像素值
@Override
public void onPageScrolled(int position, float positionOffset,int positionOffsetPixels) {}
// 选中某一页的监听
@Override
public void onPageSelected(int position) {
if (position == newsList.size() - 1) {
// 设置当前值为1
currentPosition = FIRST_PAGE;
} else if (position == 0) {
// 如果索引值为0了,就设置索引值为倒数第二个
currentPosition = newsList.size() - 2;
} else {
currentPosition = position;
}
} });

以上是对ViewPager之真正轮播的代码演示

智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告