用最简单最实用的方式实现ViewPager无限循环两种方式

    先上效果:

                                

第一种:

实现原理

              有三张图片,实现无限循环。在viewpager中设置5个view,第一个为三张图片的最后一张,第五张为三张图片的第一张。图片顺序如下数字:

                                         2-0-1-2-0

             0-1-2为正常的三个图片。2,0  为添加的两个图片view

滑动的顺序:进入页面显示0图片,向右滑动到0时,将0页设置为0,则可以继续向右滑动。同理当向左滑动到  2 时,将2页设置为2。


下面贴代码:

ViewpagerDemo.java

package com.example.demo;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

public class ViewpagerDemo extends Activity implements OnPageChangeListener {

	private ViewPager viewPager;
	private List<ImageView> listviews;
	private int[] pics = { R.drawable.xu1, R.drawable.xu2, R.drawable.xu3 };

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.viewpager);

		viewPager = (ViewPager) findViewById(R.id.viewpager);
		listviews = new ArrayList<ImageView>();
		// 添加viewpager多出的两个view
		int length = pics.length + 2;
		for (int i = 0; i < length; i++) {
			ImageView imageView = new ImageView(ViewpagerDemo.this);
			ViewGroup.LayoutParams viewPagerImageViewParams = new ViewGroup.LayoutParams(
					ViewGroup.LayoutParams.FILL_PARENT,
					ViewGroup.LayoutParams.FILL_PARENT);
			imageView.setLayoutParams(viewPagerImageViewParams);
			imageView.setScaleType(ImageView.ScaleType.FIT_XY);
			listviews.add(imageView);
		}

		viewPager.setAdapter(new ViewPagerAdapter());
		viewPager.setOnPageChangeListener(ViewpagerDemo.this);
		// 设置viewpager在第二个视图显示
		viewPager.setCurrentItem(1);
	}

	@Override
	public void onPageScrollStateChanged(int arg0) {

	}

	@Override
	public void onPageScrolled(int arg0, float arg1, int arg2) {
	}

	@Override
	public void onPageSelected(int i) {

		int pageIndex = i;

		if (i == 0) {
			// 当视图在第一个时,将页面号设置为图片的最后一张。
			pageIndex = pics.length;
		} else if (i == pics.length + 1) {
			// 当视图在最后一个是,将页面号设置为图片的第一张。
			pageIndex = 1;
		}
		if (i != pageIndex) {
			viewPager.setCurrentItem(pageIndex, false);
			return;
		}
	}

	class ViewPagerAdapter extends PagerAdapter {

		@Override
		public void destroyItem(ViewGroup container, int position, Object object) {
			ImageView view = listviews.get(position);
			container.removeView(view);
			view.setImageBitmap(null);
		}

		@Override
		public Object instantiateItem(ViewGroup container, int i) {
			if (i == 0) {
				listviews.get(i).setImageResource(pics[2]);
			} else if (i == (listviews.size() - 1)) {
				listviews.get(i).setImageResource(pics[0]);
			} else {
				listviews.get(i).setImageResource(pics[i - 1]);
			}
			container.addView(listviews.get(i));
			return listviews.get(i);
		}

		@Override
		public int getCount() {
			return listviews.size();
		}

		@Override
		public boolean isViewFromObject(View view, Object o) {
			return view == o;
		}
	}
}
第二种:
实现原理: 在适配器中将getcount的值设置为无限大。然后将3份图片加载其中。
package com.example.demo;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

public class ViewpagerDemo2 extends Activity {

	private ViewPager viewPager;
	private List<ImageView> listviews;
	private int[] pics = { R.drawable.xu1, R.drawable.xu2, R.drawable.xu3 };

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.viewpager);

		viewPager = (ViewPager) findViewById(R.id.viewpager);
		listviews = new ArrayList<ImageView>();
		for (int i = 0; i < pics.length; i++) {
			ImageView imageView = new ImageView(ViewpagerDemo2.this);
			ViewGroup.LayoutParams viewPagerImageViewParams = new ViewGroup.LayoutParams(
					ViewGroup.LayoutParams.FILL_PARENT,
					ViewGroup.LayoutParams.FILL_PARENT);
			imageView.setLayoutParams(viewPagerImageViewParams);
			imageView.setScaleType(ImageView.ScaleType.FIT_XY);
			imageView.setImageResource(pics[i]);
			listviews.add(imageView);
		}
		viewPager.setAdapter(new ViewPagerAdapter());
		viewPager.setCurrentItem(499);
	}

	class ViewPagerAdapter extends PagerAdapter {

		@Override
		public Object instantiateItem(ViewGroup container, int position) {
			if (listviews.get(position % listviews.size()).getParent() != null) {
				((ViewPager) listviews.get(position % listviews.size())
						.getParent()).removeView(listviews.get(position
						% listviews.size()));
			}
			((ViewPager) container).addView(
					listviews.get(position % listviews.size()), 0);
			return listviews.get(position % listviews.size());
		}

		@Override
		public int getCount() {
			return Integer.MAX_VALUE;
		}

		@Override
		public boolean isViewFromObject(View view, Object o) {
			return view == o;
		}
	}
}


转载请注明出处:http://blog.csdn.net/just_sanpark/article/details/17436037



  • 2
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值