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的包太 ...
随机推荐
- .NetCore关于Cap(RabbitMQ)结合MySql使用出现MySql相关类冲突问题解决办法
问题还原 引用了 DotNetCore.CAP.MySql MySql.Data.EntityFrameworkCore 在使用MySql相关对象的时候会出现如下冲突,在命名空间加入伪空间名称是不能解 ...
- 007 @CookieValue绑定请求中的cookie
1.介绍 2.使用的cookie 3.index.jsp <%@ page language="java" contentType="text/html; char ...
- 001.WordPress建站部署
一 WordPress简介 WordPress是一种使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站.也可以把 WordPress当作一个内容管理系统( ...
- css3 matrix 2D矩阵和canvas transform 2D矩阵
一看到“2D矩阵”这个高大上的名词,有的同学可能会有种畏惧感,“矩阵”,看起来好高深的样子,我还是看点简单的吧.其实本文就很简单,你只需要有一点点css3 transform的基础就好. 没有前戏,直 ...
- HashMap分析 + 哈希表
http://www.cnblogs.com/hzmark/archive/2012/12/24/HashMap.html http://www.cnblogs.com/xqzt/archive/20 ...
- mysql三大特性、三范式、五大约束
1.数据库的三大特性 '实体':表 '属性':表中的数据(字段) '关系':表与表之间的关系 2.数据库设计三大范式 a:确保每列保持原子性(即数据库表中的所有字段值是不可分解的原子值) b:确保表中 ...
- UEditor 的使用
UEditor 的使用 一.UEditor 的使用 官方网站:http://ueditor.baidu.com/website/ 下载地址:http://ueditor.baidu.com/websi ...
- 「PKUWC2018」猎人杀
「PKUWC2018」猎人杀 解题思路 首先有一个很妙的结论是问题可以转化为已经死掉的猎人继续算在概率里面,每一轮一直开枪直到射死一个之前没死的猎人为止. 证明,设所有猎人的概率之和为 \(W\) , ...
- [BZOJ2124]等差子序列/[CF452F]Permutation
[BZOJ2124]等差子序列/[CF452F]Permutation 题目大意: 一个\(1\sim n\)的排列\(A_{1\sim n}\),询问是否存在\(i,j(i<j)\),使得\( ...
- Loj 10211 sumdiv
题目描述 求 A^B 的所有约数之和 mod 9901. 首先,我们要求出A的约数之和. 就是把A分解质因数,成为:a1^k1*a2^k2*a3^k2.... 然后约数和就是(a1^0+a1^1+a1 ...