Android ViewPager使用方法

本文介绍了如何在Android应用中使用ViewPager控件实现分页显示功能,并通过适配器加载不同类型的布局,如图片、广告、产品信息等,同时详细说明了适配器的几个关键方法及其实现逻辑。

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

       ViewPager是一个能平滑分页显示的控件,对于某些应用选择该控件是极其方便的,如显示照片、广告、产品信息等。如果需要轮播,只需要加一个定时器即可实现。下面首先介绍使用ViewPager的一般方式。

       我们需要在xml里面定义好ViewPager组件,

<android.support.v4.view.ViewPager
            android:id="@+id/viewpager"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"/>

     定义好后,我们可以在Activity中找到这个ViewPager,对其分配一个适配器。

mViewPager = (ViewPager) findViewById(R.id.viewpager);
mViewPagerAdapter = new MyViewPagerAdapter(this, mJsonArray);
mViewPager.setAdapter(mViewPagerAdapter);

     在这里重点是写一个继承于PagerAdapter的子类,如public class MyViewPagerAdapter extends PagerAdapter,new MyViewPagerAdapter(this, mJsonArray)中的第二个参数是装载到ViewPager中的数据源,是一个JSONArray,这个数据源可以从服务器上获取,也可以从Android设备本地获取。在这个类里,需要覆写几个重要的方法:

  1.     public Object instantiateItem(ViewGroup container, int position)
  2.     public int getCount()
  3.     public void destroyItem(View container, int position, Object object)
  4.     public boolean isViewFromObject(View view, Object object)
第一个方法是初始化方法,在这里添加viewpager中的不同布局的view,如下面的itemView = new LcCpItemView(mContext, dataObj)、staItemView = new SingleStaItemView(mContext)、adItemView = new GgItemView(mContext);这几个对象类都是LinearLayout的子类,在这些类里,加载自己想要的布局文件以及数据源。
@Override
	public Object instantiateItem(ViewGroup container, int position) { // 这个方法用来实例化页卡
		try {
//			Log.e(TAG, "position=" + position);
			dataObj = (JSONObject) mArray.get(position);
			String type = dataObj.getString("type");
			if ("CP".equals(type)) {

				LcCpItemView itemView;
				itemView = new LcCpItemView(mContext, dataObj);

				((ViewPager) container).addView(itemView);
				return itemView;

			} else if ("YG".equals(type)) {
				SingleStaItemView staItemView;
//				Log.e(TAG, "instantiate:" + position);
				staItemView = new SingleStaItemView(mContext);
				ImageView imageView = (ImageView) staItemView
						.findViewById(R.id.sb);

				imageView
						.setOnLongClickListener(new View.OnLongClickListener() {
							@Override
							public boolean onLongClick(View v) {
								login(mContext);
								return true;
							}
						});

				staItemView.setData(dataObj);

				if (staItemView.bitmap != null
						&& !staItemView.bitmap.isRecycled()) {

					staItemView.bitmap.isRecycled();
				}
				System.gc();

				((ViewPager) container).addView(staItemView);

				return staItemView;
			} else if ("GG".equals(type)) {
				GgItemView adItemView;
				adItemView = new GgItemView(mContext);
				adItemView.setData(dataObj, position);

				if (adItemView.bitmap != null
						&& !adItemView.bitmap.isRecycled()) {

					adItemView.bitmap.isRecycled();
				}
				System.gc();

				((ViewPager) container).addView(adItemView);

				return adItemView;
			}

		} catch (JSONException e) {
			e.printStackTrace();
		}

		return null;

	}
第二个方法是获取总共页数的方法
@Override
	public int getCount() {

		return mArray.length();// 返回页卡的数量
	}

第三个方法是销毁掉页面的方法,只有添加了这个方法,对某些页面进行销毁后,才不会出现内存溢出错误
	@Override
	public void destroyItem(View container, int position, Object object) {

		((ViewGroup) container).removeView((View) object);

	}

ViewPager还有其监听事件,如触摸事件:
mViewPager.setOnTouchListener(new View.OnTouchListener() {

				@Override
				public boolean onTouch(View v, MotionEvent event) {
					switch (event.getAction()) {
					case MotionEvent.ACTION_DOWN:
					case MotionEvent.ACTION_MOVE:
						isContinue = false;
						break;
					case MotionEvent.ACTION_UP:
						isContinue = true;
						break;
					default:
						isContinue = true;
						break;
					}
					return false;
				}
			});

页面变化监听事件:
OnPageChangeListener pageListener = new OnPageChangeListener() {

		@Override
		public void onPageSelected(int arg0) {
			// Log.e(TAG, "onPageSelected():arg0="+arg0);
			isContinue = false;

			random = arg0 - 1;
			// Log.e(TAG, "换页后random="+random);
			isContinue = true;

		}

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

		}

		@Override
		public void onPageScrollStateChanged(int arg0) {

		}
	};

mViewPager.setOnPageChangeListener(pageListener);

完成上述几个步骤基本就能够实现分页效果了,下图是为"GG".equals(type)的情况,这个布局里就只有一个ImageView。
      








 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值