Android ViewPager使用方法

来源:互联网 发布:阿里云公司 编辑:程序博客网 时间:2024/06/06 17:13

       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的子类,在这些类里,加载自己想要的布局文件以及数据源。
@Overridepublic 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() {@Overridepublic 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;}
第二个方法是获取总共页数的方法
@Overridepublic int getCount() {return mArray.length();// 返回页卡的数量}

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

ViewPager还有其监听事件,如触摸事件:
mViewPager.setOnTouchListener(new View.OnTouchListener() {@Overridepublic 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() {@Overridepublic void onPageSelected(int arg0) {// Log.e(TAG, "onPageSelected():arg0="+arg0);isContinue = false;random = arg0 - 1;// Log.e(TAG, "换页后random="+random);isContinue = true;}@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {}@Overridepublic void onPageScrollStateChanged(int arg0) {}};

mViewPager.setOnPageChangeListener(pageListener);

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


原创粉丝点击