大家知道Viewpager在普通的情况下是不能实现循环滑动的,本人在网上看了许多博客,无外乎他们的方法就是把getCount的返回值设置的很大,本人也这样试过,确实可以实现向右循环滑动,但是向左滑动时程序就会挂掉,具体原因我还没找到,如果有哪位大神知道请赐教
好现在讲讲我自己的方法
原理:简单来说就是用到了ViewPager的一个方法setCurrentItem这个方法,我们的数据源也需要作出相应的改变,比原来的情况需要多出2个,这两个多余的分别放在首末的位置,具体为什么要这么做看代码,这样更直观
首先布局,这个很简单都一样不多说
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<android.support.v4.view.ViewPager
android:id="@+id/id_vp"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v4.view.ViewPager>
</LinearLayout>
PagerAdapter这个也很简单没有什么多讲的,与普通的ViewPager的适配器一样
public class MAdapter extends PagerAdapter {
List<ImageView> mDatas;
public MAdapter(List<ImageView> datas) {
mDatas=datas;
}
@Override
public int getCount() {
return mDatas.size();
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0==arg1;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
Log.i("PagerAdapter","destroyItem:"+ position);
container.removeView(mDatas.get(position));
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
Log.i("PagerAdapter","instantiateItem:"+ position);
container.addView(mDatas.get(position));
return mDatas.get(position);
}
}
public class MainActivity extends Activity implements OnPageChangeListener{
private ViewPager mViewPager;
private List<ImageView> mDatas;
private PagerAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initDatas();
mAdapter=new MAdapter(mDatas);
mViewPager.setAdapter(mAdapter);
mViewPager.setCurrentItem(1);//注意把其实位置设为1
mViewPager.setOnPageChangeListener(this);
}
private void initView() {
mViewPager=(ViewPager) findViewById(R.id.id_vp);
}
private void initDatas(){
mDatas=new ArrayList<ImageView>();
//这里添加冗余数据,它其实是与倒数第二个数据一模一样
ImageView iv0=new ImageView(this);
iv0.setBackgroundColor(Color.YELLOW);
mDatas.add(iv0);
ImageView iv1=new ImageView(this);
iv1.setBackgroundColor(Color.RED);
mDatas.add(iv1);
ImageView iv2=new ImageView(this);
iv2.setBackgroundColor(Color.BLUE);
mDatas.add(iv2);
ImageView iv3=new ImageView(this);
iv3.setBackgroundColor(Color.GREEN);
mDatas.add(iv3);
ImageView iv4=new ImageView(this);
iv4.setBackgroundColor(Color.YELLOW);
mDatas.add(iv4);
//这里也是冗余数据,它与第二的数据是一模一样的,具体什么说用看onPageScrolled方法就知道了
ImageView iv5=new ImageView(this);
iv5.setBackgroundColor(Color.RED);
mDatas.add(iv5);
}
@Override
public void onPageScrollStateChanged(int state) {
}
//完美实现左滑右滑
@Override
public void onPageScrolled(int position, float offsetPerc, int offsetPixel) {
Log.i("TAG", "position="+position+" offsetPerc="+offsetPerc);
//关键地方自己好好琢磨
if(position==0){
if (offsetPerc==0) {
mViewPager.setCurrentItem(mDatas.size()-2, false);
}
}
if (position==mDatas.size()-1) {
if(offsetPerc==0){
mViewPager.setCurrentItem(1, false);
}
}
}
@Override
public void onPageSelected(int position) {
}
}