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

之前的actionbar+fragment文章中写过viewpager的简单用法,但因为是融合的文章,所以今天把viewpager提取出来写了。方便查询浏览~
思路:
1.在布局文件中设置viewpager控件
2.在acitvity中找到它
3.自定义一个适配器,这个适配器需要一个list<View>来构造
4.定义一个list<View>来放入几个view,并用其来初始化适配器
5.给viewPager来设置适配器和监听器
实现:
1.布局文件,这里放一个指示文字。实际中可以用多个圆点来替换

<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);
} }
}
ViewPager的简单用法+适配器+监听器的介绍的更多相关文章
- 浅谈ViewPager与TabLayout的简单用法
今天介绍一下ViewPager与TabLayout的简单用法 1.准备 在一切开始之前,你懂得,先导库,老方法,在build.gradle直接添加下面这一句 implementation ...
- Android MultiType第三方库的基本使用和案例+DiffUtil的简单用法
1.MultiType简单介绍 1.1.MultiType用于比较复杂的页面. 如下图,今日头条用到了MultiType处理各种复杂的页面. 这种还是比较简单的类型.因为一个页面也就这种类型. ...
- Android Spinner的简单用法。
今天学到的是spinner,就是下拉列表,这可不是ExpandListView哈. 闲话不解释.这是控件,所以先上布局:就不上线性布局了,基本上可以总结出,控件都得在布局里写,写之前嵌个布局就行. & ...
- [转]Valgrind简单用法
[转]Valgrind简单用法 http://www.cnblogs.com/sunyubo/archive/2010/05/05/2282170.html Valgrind的主要作者Julian S ...
- listActivity和ExpandableListActivity的简单用法
http://www.cnblogs.com/limingblogs/archive/2011/10/09/2204866.html 今天自己简单的总结了listActivity和Expandable ...
- Knockout简单用法
Knockout简单用法 在最近做的一个项目中,页面数据全部通过js ajax调用webapi接口获取,也就是说页面的数据全部使用javascript脚本填充,这就想到了使用一个MVVM模式的js框架 ...
- JS的简单用法
JS的简单用法 参考:http://www.w3school.com.cn/js/js_switch.asp JavaScript 是网络的脚本语言 JavaScript 是可插入 HTML 页面的编 ...
- Func和Action委托简单用法
Func和Action类是特殊的类型,它们允许你在不必指定自定义委托类型的情况下,去使用委托.在整个.NET框架中都可以使用它们.例如,在我们考察并行计算时,你也会看到这两个类的示例. 上面一段文字是 ...
- slf4j的简单用法以及与log4j的区别
之前在项目中用的日志记录器都是log4j的日志记录器,可是到了新公司发现都是slf4j,于是想着研究一下slf4j的用法. 注意:每次引入Logger的时候注意引入的jar包,因为有Logger的包太 ...
随机推荐
- 用Fiddler对Android应用进行抓包
前言 Fiddler是一款非常流行并且实用的http抓包工具,它的原理是在本机开启了一个http的代理服务器,然后它会转发所有的http请求和响应,因此,它比一般的firebug或者是chrome自带 ...
- JAVAssist字节码操作
Java动态性的两种常见实现方式 字节码操作 反射 运行时操作字节码可以让我们实现如下功能: 动态生成新的类 动态改变某个类的结构(添加/删除/修改 新的属性/方法) 优势: 比反射开销小,性能高 ...
- Xcode6.1 模拟器路径
Xcode 5的iOS模拟器的应用的目录是在~/Library/Application Support/iPhone Simulator/<iOS_Version>/Application ...
- 搭建基于MyEclipse的Hadoop开发环境
不多说,直接上干货! 前面我们已经搭建了一个伪分布模式的Hadoop运行环境.请移步, hadoop-2.2.0.tar.gz的伪分布集群环境搭建(单节点) 我们绝大多数都习惯在Eclipse或MyE ...
- 004.KVM日常管理1
一 常用命令 1.1 查看虚机列表及状态 [root@kvm-host ~]# virsh list --all 1.2 连接虚机 [root@kvm-host ~]# virsh console v ...
- 使用ajax与jqplot的小体会
在使用ajax与jqplot时遇到了传值的问题!一开始都不知值是怎么传过去的,只找到了例子是以<div id="data">原始数据</div>这样子来接收 ...
- InnoDB的锁机制浅析(四)—不同SQL的加锁状况
不同SQL的加锁状况 文章总共分为五个部分: InnoDB的锁机制浅析(一)-基本概念/兼容矩阵 InnoDB的锁机制浅析(二)-探索InnoDB中的锁(Record锁/Gap锁/Next-key锁/ ...
- ARP协议详解之Gratuitous ARP(免费ARP)
ARP协议详解之Gratuitous ARP(免费ARP) Gratuitous ARP(免费ARP) Gratuitous ARP也称为免费ARP,无故ARP.Gratuitous ARP不同于一般 ...
- ueditor上传图片设置的简单实例
0.前言:我用过ckeditor,kingeditor还是感觉ueditor最好用,功能强大,经常更新.之前因为升级了struts2到2.5的了,原本的kingeditor已经不能共存,于是找到了ud ...
- WAP2.0(XHTML MP)基础介绍
(一)XHTML MP 介绍XHTML MP(eXtensible HyperText Markup Language Mobile Profile)WAP2.0与WCSS(WAP CSS /WAP ...