android viewPager网络加载图片无限自动轮播

本文介绍了一种使用Android的ViewPager实现无限循环轮播的方法。通过自定义PagerAdapter,并利用Handler发送消息来控制ViewPager的滚动状态,实现平滑过渡的效果。此外,还介绍了如何通过监听ViewPager的滚动事件来更新指示器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

欢迎大家吐槽偷笑偷笑偷笑,有什么问题或bug,我们一起探讨。。。。


先看效果,还有demo自己可以看。。



activity中代码:

public class MainActivity extends Activity {

	private ViewPager mViewPager;
	// 记录当前的页数
	private int mCount = 0;
	// 开始
	public static final int START = -1;
	// 停止
	public static final int STOP = -2;
	// 更新
	public static final int UPDATE = -3;
	// 接受传过来的当前页面数
	public static final int RECORD = -4;
	private List<ImageView> mList;
	private MyPagerAdapter mAdapter;
	private List<String> urlList;
	private ImageView dot1, dot2, dot3, dot0;
	private ImageView[] dots = new ImageView[4];
	private Handler handler = new Handler() {
		public void handleMessage(android.os.Message msg) {

			switch (msg.what) {
			case START:
				handler.sendEmptyMessageDelayed(UPDATE, 3000);
				break;
			case STOP:
				handler.removeMessages(UPDATE);
				break;
			case UPDATE:
				mCount++;
				mViewPager.setCurrentItem(mCount);
				break;
			case RECORD:
				mCount = msg.arg1;
				break;

			default:
				break;
			}

		}
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		initView();
		init();
		setListener();
		mAdapter = new MyPagerAdapter(mList);
		mViewPager.setAdapter(mAdapter);
		int i = Integer.MAX_VALUE / 2 % mList.size();
		// 默认在中间,让用户看不到边界
		mViewPager.setCurrentItem(Integer.MAX_VALUE / 2 - i);
		handler.sendEmptyMessage(START);
	}

	private void init() {
		// TODO Auto-generated method stub
		urlList = new ArrayList<String>();
		mList = new ArrayList<ImageView>();
		urlList.add("http://tupian.enterdesk.com/2015/saraxuss/04/17/gou/1/3.jpg");
		urlList.add("http://s2.nuomi.bdimg.com/upload/deal/2014/1/V_L/623682-1391756281052.jpg");
		urlList.add("http://media.chunyuyisheng.com/media/images/2013/05/15/9173ce6d26d9.jpg");
		urlList.add("http://img1.imgtn.bdimg.com/it/u=1856251628,4049763171&fm=21&gp=0.jpg");
		DisplayImageOptions options = new DisplayImageOptions.Builder()
				.cacheInMemory(true).displayer(new RoundedBitmapDisplayer(50))
				.displayer(new FadeInBitmapDisplayer(100)).cacheOnDisk(true)
				.bitmapConfig(Bitmap.Config.RGB_565).build();

		ImageView imageView;
		for (int i = 0; i < 4; i++) {
			imageView = new ImageView(MainActivity.this);
			imageView.setScaleType(ScaleType.FIT_XY);
			// 使用的ImageLoader网络加载图片,需先在Application和清单文件中配置在使用
			ImageLoader.getInstance().displayImage(urlList.get(i), imageView,
					options);
			mList.add(imageView);
			imageView.setOnClickListener(new OnClickListener() {

				@Override
				public void onClick(View v) {
					System.out.println("==========m==" + mCount % mList.size());
					// 这里写点击图片的操作 mCount % mList.size()这个点击的第几个图片
				}
			});
		}
	}

	private void initView() {
		// TODO Auto-generated method stub
		mViewPager = (ViewPager) findViewById(R.id.viewPager);
		dot0 = (ImageView) findViewById(R.id.dot1);
		dot1 = (ImageView) findViewById(R.id.dot2);
		dot2 = (ImageView) findViewById(R.id.dot3);
		dot3 = (ImageView) findViewById(R.id.dot4);
		dots[0] = dot0;
		dots[1] = dot1;
		dots[2] = dot2;
		dots[3] = dot3;
		dot0.setSelected(true);
	}

	private void setListener() {
		// TODO Auto-generated method stub
		mViewPager.setOnPageChangeListener(new OnPageChangeListener() {

			@Override
			public void onPageSelected(int arg0) {
				// TODO Auto-generated method stub
				handler.sendMessage(Message.obtain(handler, RECORD, arg0, 0));
				// 下面是控制点的变化
				int j = arg0 % mList.size();
				for (int i = 0; i < dots.length; i++) {
					dots[i].setSelected(false);
				}
				dots[j].setSelected(true);
			}

			@Override
			public void onPageScrolled(int arg0, float arg1, int arg2) {
				// TODO Auto-generated method stub

			}

			@Override
			public void onPageScrollStateChanged(int arg0) {
				// TODO Auto-generated method stub
				switch (arg0) {
				// 当滑动时让当前轮播停止
				case ViewPager.SCROLL_STATE_DRAGGING:
					handler.sendEmptyMessage(STOP);
					break;
				// 滑动停止时继续轮播
				case ViewPager.SCROLL_STATE_IDLE:
					handler.sendEmptyMessage(START);
					break;
				}
			}
		});

	}
}


自定义pagerAdapter(大同小异)
public class MyPagerAdapter extends PagerAdapter {

	private List<ImageView> imageViews;

	public MyPagerAdapter(List<ImageView> list) {
		super();
		imageViews = list;
		// TODO Auto-generated constructor stub
	}

	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return Integer.MAX_VALUE;
	}

	@Override
	public boolean isViewFromObject(View arg0, Object arg1) {
		// TODO Auto-generated method stub
		return arg0 == arg1;
	}

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

	@Override
	public Object instantiateItem(ViewGroup container, int position) {
		// TODO Auto-generated method stub
		// 因为实际只有几个页面但是我们要无限循环,所以取模计算出当前的是第几个页面
		int i = position % imageViews.size();
		// 预防负值
		position = Math.abs(i);
		ImageView imageView = imageViews.get(position);
		ViewParent parent = imageView.getParent();
		// remove掉View之前已经加到一个父控件中,否则报异常
		if (parent != null) {
			ViewGroup group = (ViewGroup) parent;
			group.removeView(imageView);
		}
		container.addView(imageView);
		return imageView;
	}
}


布局文件:(圆点的就不贴了,可看demo)

<RelativeLayout 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"
    tools:context=".MainActivity" >

   <android.support.v4.view.ViewPager
       android:id="@+id/viewPager"
       android:layout_width="wrap_content"
       android:layout_height="200dp"
       >
   </android.support.v4.view.ViewPager>
<LinearLayout 
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:gravity="center_horizontal"
    android:layout_alignBottom="@id/viewPager"
    android:layout_marginBottom="10dp"
    >
    <ImageView 
        android:id="@+id/dot1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        
        android:src="@drawable/dot_layout"/>
    <ImageView 
        android:id="@+id/dot2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
         android:layout_margin="5dp"
        android:src="@drawable/dot_layout"/>
    <ImageView 
        android:id="@+id/dot3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
         android:layout_margin="5dp"
        android:src="@drawable/dot_layout"/>
    <ImageView 
        android:id="@+id/dot4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
         android:layout_margin="5dp"
        android:src="@drawable/dot_layout"/>
    
    
</LinearLayout>
</RelativeLayout>

点击获取:源码demo





评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值