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设备本地获取。在这个类里,需要覆写几个重要的方法:
- public Object instantiateItem(ViewGroup container, int position)
- public int getCount()
- public void destroyItem(View container, int position, Object object)
- 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。