1、ViewPager:
在布局文件中:标签名必须是全类名
<android.support.v4.view.ViewPager
android:id="@+id/vp"
android:layout_width="wrap_content"
android:layout_height="200dp"
/>
PagerAdapter:
public class MyAdapter extends PagerAdapter {
private List<ImageView> mList;
public MyAdapter(List<ImageView> list) {
this.mList = list;
}
// 用来决定ViewPager中子视图的个数.
@Override
public int getCount() {
// return mList != null ? mList.size() : 0;
return Integer.MAX_VALUE;
}
// 用来产生一个条目.
// container:指的就是ViewPager;position:每个条目的位置.
@Override
public Object instantiateItem(ViewGroup container, int position) {
// 5:0----4
// 10:0---9
// 取余之后的范围:0---4
// 将子视图添加到容器中
container.addView(mList.get(position % mList.size()));
return mList.get(position % mList.size());
}
// view==obj--->true:系统不会再次产生一个新的条目,而是复用以前的条目;
// false:系统会产生一个新的条目来进行展示.
// view:当前正在展示的那个子视图;obj:instantiateItem()方法的返回值.
@Override
public boolean isViewFromObject(View view, Object obj) {
return view == obj;
}
// 篮子:ViewPager.容器
// 鸡蛋:View.子视图
// 母鸡:List.集合
// 从容器中移除某个条目."篮子里放鸡蛋"
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(mList.get(position % mList.size()));
}
}
在MainActivity中的代码:
public class MainActivity extends Activity implements OnPageChangeListener {
private ViewPager mVp;
private TextView tvTitle;
private String[] titles;
private LinearLayout llPoints;
private int prePosition = 0;
// 是否是自动切换的开关
private boolean isLoop = true;
private Handler mHanlder = new Handler() {
// 处理消息
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 1:
// 获取当前正在展示的视图的position
int position = mVp.getCurrentItem();
// 切换到下一个视图
mVp.setCurrentItem(position + 1);//当position等于4的时候再加1不就越界?//setCurrentItem内部吃掉了异常,或者不丢出异常,这个要看它内部的实现
break;
}
};
};
private List<ImageView> list;
@SuppressWarnings("deprecation")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
titles = getTitles();
int[] imageRes = getImageRes();
List<ImageView> list = initData(imageRes);
tvTitle.setText(titles[0]);
// 获取0位置的View的背景图片
llPoints.getChildAt(0).setBackgroundResource(R.drawable.dot_enable);
MyAdapter adapter = new MyAdapter(list);
mVp.setAdapter(adapter);
mVp.setOnPageChangeListener(this);
// handler机制(原理):Handler;Message;MessageQueue;Looper.
// 自动切换:不停的发消息
new Thread() {
public void run() {
while (isLoop) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
mHanlder.sendEmptyMessage(1);
}
};
}.start();
}
// 初始化数据
private List<ImageView> initData(int[] imageRes) {
list = new ArrayList<ImageView>();
for (int i = 0; i < imageRes.length; i++) {
// 创建数据源
ImageView iv = new ImageView(this);
iv.setBackgroundResource(imageRes[i]);
list.add(iv);
// 往线性布局中添加小圆点
View view = new View(this);
// 布局参数:指定宽,高.
LayoutParams params = new LayoutParams(40, 40);
view.setLayoutParams(params);
params.leftMargin = 5;
view.setBackgroundResource(R.drawable.dot_normal);
llPoints.addView(view);
}
return list;
}
// 初始化控件
private void initView() {
mVp = (ViewPager) findViewById(R.id.vp);
tvTitle = (TextView) findViewById(R.id.tv_title);
llPoints = (LinearLayout) findViewById(R.id.ll_points);
}
// 得到标题的内容
private String[] getTitles() {
return new String[] { "干露露和她不要face的妈咪", "朴树又回来啦...", "东风吹来
一地鸡毛.",
"乐视TV送电视啦", "屌丝的逆袭" };
}
// 得到图片的资源id
private int[] getImageRes() {
return new int[] { R.drawable.a, R.drawable.b, R.drawable.c,
R.drawable.d, R.drawable.e };
}
/************************* ViewPager页面切换的监听 ********************************/
// 当页面滚动状态发生改变的时候调用.空闲状态:idle;触摸并滚动:touch_scroll;猛动:fling
@Override
public void onPageScrollStateChanged(int state) {
}
// 当页面滚动的时候...
// position:位置;offset:在屏幕上移动的百分比:0--1;distance:移动的真实的距离,以像素为单
位.
@Override
public void onPageScrolled(int position, float offset, int distance) {
// Log.i("TAG", "arg0=" + position + ",arg1=" + offset + ",arg2="
// + distance);
}
// 当页面被选中的时候调用
@Override
public void onPageSelected(int position) {
// 改变标题
tvTitle.setText(titles[position % list.size()]);
// 改变当前位置的小圆点背景图
llPoints.getChildAt(position % list.size()).setBackgroundResource(
R.drawable.dot_enable);
// 改变前一个位置的小圆点背景图
llPoints.getChildAt(prePosition).setBackgroundResource(
R.drawable.dot_normal);
// 改变prePosition的值
prePosition = position % list.size();
}
@Override
protected void onDestroy() {
super.onDestroy();
isLoop = false;
}
}
2、PagerAdapter中的方法
// 得到每个页面对应的标题,就是导航条的标题
@Override
public CharSequence getPageTitle(int position) {
return titles[position];
}
3、android自己的导航条
布局文件中写在ViewPager中间:
<android.support.v4.view.ViewPager
android:id="@+id/vp"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<android.support.v4.view.PagerTabStrip
android:id="@+id/pts"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</android.support.v4.view.ViewPager>
MainActivity中可以设置导航条的属性:
//改变导航条的背景图/色
//mStrip.setBackgroundResource(resId);
//mStrip.setBackgroundColor(Color.RED);
//设置底部的下划线是否可用
mStrip.setDrawFullUnderline(true);
//设置指示器的颜色
mStrip.setTabIndicatorColor(Color.RED);
4、FragmentPagerAdapter当viewPager中添加的项是Fragment的时候使用