ViewPager的简单用法+适配器+监听器的介绍

时间:2025-03-06 20:36:02

ViewPager的简单用法+适配器+监听器的介绍

之前的actionbar+fragment文章中写过viewpager的简单用法,但因为是融合的文章,所以今天把viewpager提取出来写了。方便查询浏览~

思路:

1.在布局文件中设置viewpager控件

2.在acitvity中找到它

3.自定义一个适配器,这个适配器需要一个list<View>来构造

4.定义一个list<View>来放入几个view,并用其来初始化适配器

5.给viewPager来设置适配器和监听器

实现:

1.布局文件,这里放一个指示文字。实际中可以用多个圆点来替换

ViewPager的简单用法+适配器+监听器的介绍

<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"> <android.support.v4.view.ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="visible" /> <TextView
android:id="@+id/tips_textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="14dp"
android:text="指示文字"
android:textAppearance="?android:attr/textAppearanceLarge" /> </RelativeLayout>

2.定义适配器,这里是用一个list数组来构造的,当然你可以选择用别的方式来做。

/**
* @author:Jack Tony 这里配置适配器
* @tips :这里传入一个list数组,从每个list中可以剥离一个view并显示出来
* @date :2014-9-24
*/
public class MyPagerAdapter extends PagerAdapter {
private ArrayList<View> mViewList;
private int pagerNum = 0; public MyPagerAdapter(ArrayList<View> viewList) {
mViewList = viewList;
} public int getPagerNum() {
return pagerNum;
} @Override
public int getCount() {
return mViewList.size();
} @Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
} @Override
public void destroyItem(View arg0, int arg1, Object arg2) {
if (mViewList.get(arg1) != null) {
((ViewPager) arg0).removeView(mViewList.get(arg1));
}
} @Override
public Object instantiateItem(View arg0, int arg1) {
try {
if (mViewList.get(arg1).getParent() == null) {
((ViewPager) arg0).addView(mViewList.get(arg1), 0);
} else {
/*
* 很难理解新添加进来的view会自动绑定一个父类,由于一个儿子view不能与两个父类相关,
* 所以得解绑不这样做否则会产生 viewpager java.lang.IllegalStateException:
* The specified child already has a parent. You must call
* removeView() on the child's parent first.
*/
((ViewGroup) mViewList.get(arg1).getParent())
.removeView(mViewList.get(arg1));
((ViewPager) arg0).addView(mViewList.get(arg1), 0);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
pagerNum = arg1;
}
return mViewList.get(arg1);
} }

3.定义监听器,随着viewpager的滑动来改变提示文字中的数字

    /**
* @author:Jack Tony
* @tips : viewPager滑动时的监听器
* @date :2014-9-24
*/
public class PagerListener implements ViewPager.OnPageChangeListener { /*
* (非 Javadoc)
*
* @see android.support.v4.view.ViewPager.OnPageChangeListener#
* onPageScrollStateChanged(int) 此方法是在状态改变的时候调用,其中arg0这个参数
* 有三种状态(0,1,2)。
*
* arg0 == 1的时辰默示正在滑动,
* arg0 == 2的时辰默示滑动完毕了,
* arg0 == 0的时辰默示什么都没做。
*
* 当页面开始滑动的时候,三种状态的变化顺序为(1,2,0),演示如下:
*/
@Override
public void onPageScrollStateChanged(int arg0) {
// TODO 自动生成的方法存根 } /*
* (非 Javadoc)
*
* @see
* android.support.v4.view.ViewPager.OnPageChangeListener#onPageScrolled
*
* arg0 :当前页面,及你点击滑动的页面
* arg1 :当前页面偏移的百分比
* arg2 :当前页面偏移的像素位置
*
* (int, float, int) pagerNum:第几个界面(从0开始计数) offset:偏移量,计算页面滑动的距离
*/
@Override
public void onPageScrolled(int pagerNum, float arg1, int offset) { } /*
* (非 Javadoc)
*
* @see
* android.support.v4.view.ViewPager.OnPageChangeListener#onPageSelected
* (int) 判断当前是哪个view
*/
@Override
public void onPageSelected(int position) {
// TODO 自动生成的方法存根
tipsTv.setText(String.valueOf(position+1));
} }

4.设置适配器和监听器

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); tipsTv = (TextView) findViewById(R.id.tips_textView);
tipsTv.setText("1"); viewPager = (ViewPager) findViewById(R.id.viewPager);
// 给viewList装入数组
for (int i = 0; i < 5; i++) {
viewList.add(newView(i + 1));
}
// 设置适配器,将数组设置进去
viewPager.setAdapter(new MyPagerAdapter(viewList));
viewPager.setOnPageChangeListener(new PagerListener()); } public View newView(int text) {
TextView tv = new TextView(this);
tv.setText(String.valueOf(text));
tv.setTextSize(100);
tv.setTextColor(0xff000000);
tv.setGravity(Gravity.CENTER);
return tv;
}

最后是全部代码:

package com.kale.viewpager;

import java.util.ArrayList;

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView; public class MainActivity extends Activity { TextView tipsTv; ViewPager viewPager;
ArrayList<View> viewList = new ArrayList<View>(); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); tipsTv = (TextView) findViewById(R.id.tips_textView);
tipsTv.setText("1"); viewPager = (ViewPager) findViewById(R.id.viewPager);
// 给viewList装入数组
for (int i = 0; i < 5; i++) {
viewList.add(newView(i + 1));
}
// 设置适配器,将数组设置进去
viewPager.setAdapter(new MyPagerAdapter(viewList));
viewPager.setOnPageChangeListener(new PagerListener()); } public View newView(int text) {
TextView tv = new TextView(this);
tv.setText(String.valueOf(text));
tv.setTextSize(100);
tv.setTextColor(0xff000000);
tv.setGravity(Gravity.CENTER);
return tv;
} /**
* @author:Jack Tony
* @tips : viewPager滑动时的监听器
* @date :2014-9-24
*/
public class PagerListener implements ViewPager.OnPageChangeListener { /*
* (非 Javadoc)
*
* @see android.support.v4.view.ViewPager.OnPageChangeListener#
* onPageScrollStateChanged(int) 此方法是在状态改变的时候调用,其中arg0这个参数
* 有三种状态(0,1,2)。
*
* arg0 == 1的时辰默示正在滑动,
* arg0 == 2的时辰默示滑动完毕了,
* arg0 == 0的时辰默示什么都没做。
*
* 当页面开始滑动的时候,三种状态的变化顺序为(1,2,0),演示如下:
*/
@Override
public void onPageScrollStateChanged(int arg0) {
// TODO 自动生成的方法存根 } /*
* (非 Javadoc)
*
* @see
* android.support.v4.view.ViewPager.OnPageChangeListener#onPageScrolled
*
* arg0 :当前页面,及你点击滑动的页面
* arg1 :当前页面偏移的百分比
* arg2 :当前页面偏移的像素位置
*
* (int, float, int) pagerNum:第几个界面(从0开始计数) offset:偏移量,计算页面滑动的距离
*/
@Override
public void onPageScrolled(int pagerNum, float arg1, int offset) { } /*
* (非 Javadoc)
*
* @see
* android.support.v4.view.ViewPager.OnPageChangeListener#onPageSelected
* (int) 判断当前是哪个view
*/
@Override
public void onPageSelected(int position) {
// TODO 自动生成的方法存根
tipsTv.setText(String.valueOf(position+1));
} } /**
* @author:Jack Tony 这里配置适配器
* @tips :这里传入一个list数组,从每个list中可以剥离一个view并显示出来
* @date :2014-9-24
*/
public class MyPagerAdapter extends PagerAdapter {
private ArrayList<View> mViewList;
private int pagerNum = 0; public MyPagerAdapter(ArrayList<View> viewList) {
mViewList = viewList;
} public int getPagerNum() {
return pagerNum;
} @Override
public int getCount() {
return mViewList.size();
} @Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
} @Override
public void destroyItem(View arg0, int arg1, Object arg2) {
if (mViewList.get(arg1) != null) {
((ViewPager) arg0).removeView(mViewList.get(arg1));
}
} @Override
public Object instantiateItem(View arg0, int arg1) {
try {
if (mViewList.get(arg1).getParent() == null) {
((ViewPager) arg0).addView(mViewList.get(arg1), 0);
} else {
/*
* 很难理解新添加进来的view会自动绑定一个父类,由于一个儿子view不能与两个父类相关,
* 所以得解绑不这样做否则会产生 viewpager java.lang.IllegalStateException:
* The specified child already has a parent. You must call
* removeView() on the child's parent first.
*/
((ViewGroup) mViewList.get(arg1).getParent())
.removeView(mViewList.get(arg1));
((ViewPager) arg0).addView(mViewList.get(arg1), 0);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
pagerNum = arg1;
}
return mViewList.get(arg1);
} }
}