之前的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的简单用法+适配器+监听器的介绍的更多相关文章

  1. 浅谈ViewPager与TabLayout的简单用法

      今天介绍一下ViewPager与TabLayout的简单用法 1.准备   在一切开始之前,你懂得,先导库,老方法,在build.gradle直接添加下面这一句   implementation ...

  2. Android MultiType第三方库的基本使用和案例+DiffUtil的简单用法

    1.MultiType简单介绍 1.1.MultiType用于比较复杂的页面. 如下图,今日头条用到了MultiType处理各种复杂的页面.    这种还是比较简单的类型.因为一个页面也就这种类型. ...

  3. Android Spinner的简单用法。

    今天学到的是spinner,就是下拉列表,这可不是ExpandListView哈. 闲话不解释.这是控件,所以先上布局:就不上线性布局了,基本上可以总结出,控件都得在布局里写,写之前嵌个布局就行. & ...

  4. [转]Valgrind简单用法

    [转]Valgrind简单用法 http://www.cnblogs.com/sunyubo/archive/2010/05/05/2282170.html Valgrind的主要作者Julian S ...

  5. listActivity和ExpandableListActivity的简单用法

    http://www.cnblogs.com/limingblogs/archive/2011/10/09/2204866.html 今天自己简单的总结了listActivity和Expandable ...

  6. Knockout简单用法

    Knockout简单用法 在最近做的一个项目中,页面数据全部通过js ajax调用webapi接口获取,也就是说页面的数据全部使用javascript脚本填充,这就想到了使用一个MVVM模式的js框架 ...

  7. JS的简单用法

    JS的简单用法 参考:http://www.w3school.com.cn/js/js_switch.asp JavaScript 是网络的脚本语言 JavaScript 是可插入 HTML 页面的编 ...

  8. Func和Action委托简单用法

    Func和Action类是特殊的类型,它们允许你在不必指定自定义委托类型的情况下,去使用委托.在整个.NET框架中都可以使用它们.例如,在我们考察并行计算时,你也会看到这两个类的示例. 上面一段文字是 ...

  9. slf4j的简单用法以及与log4j的区别

    之前在项目中用的日志记录器都是log4j的日志记录器,可是到了新公司发现都是slf4j,于是想着研究一下slf4j的用法. 注意:每次引入Logger的时候注意引入的jar包,因为有Logger的包太 ...

随机推荐

  1. 【Java】快速排序的非递归实现

    快速排序一般采用递归方法(详见快速排序及其优化),但递归方法一般都可以用循环代替.本文实现了java版的非递归快速排序. 更多:数据结构与算法合集 思路分析 采用非递归的方法,首先要想到栈的使用,通过 ...

  2. 003 jquery层次选择器

    1.介绍 2.程序 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...

  3. Java反射初探 ——“当类也学会照镜子”

    反射的作用 开门见山地说说反射的作用   1.为我们提供了全面的分析类信息的能力 2.动态加载类   我理解的“反射”的意义 (仅个人理解哈)   我理解的java反射机制就是: 提供一套完善而强大的 ...

  4. 018.Zabbix维护时间和模板导入

    一 维护时间 在某些正常业务维护期间,不需要进行告警,可添加维护时间. 二 维护时间添加 2.1 维护 参数 描述 Name 维护名称 Maintenance type 两种维护类型可选: With ...

  5. Wannafly 22A

    题解 另g = gcd(a1,a2,a3....) 那么k * g % m的方案书就是答案 这个式子子显然是有循环节的 x * g = 0 mod m ,x * g + y * m = 0 exgcd ...

  6. dsu on tree题表

    dsu on tree,又名树上启发式合并.重链剖分,是一类十分实用的trick,它常常可以作为一些正解的替代算法: 1.DFS序+线段树/主席树/线段树合并 2.对DFS序分块的树上莫队 3.长链剖 ...

  7. (android高仿系列)今日头条 --新闻阅读器 (转载)

    非常不错,原文地址:http://blog.csdn.net/vipzjyno1/article/details/26514543

  8. VM 操作系统实例化(基于 KVM 的虚拟化研究及应用--崔泽永(2011))的论文笔记

    一.VM操作系统实例化 1.建立虚拟磁盘镜像 虚拟磁盘镜像在逻辑上是提供给虚拟机使用的硬盘, 在物理上可以是 L inux系 统内一普通镜像文件, 也可以是真实的物理磁盘或分区. 本方案设计中将虚拟机 ...

  9. Linux学习笔记07—mysql的配置

    一.mysql简介 说到数据库,我们大多想到的是关系型数据库,比如mysql.oracle.sqlserver等等,这些数据库软件在windows上安装都非常的方便,在Linux上如果要安装数据库,咱 ...

  10. 操作iframe 的方法与兼容性

    首先创建两个页面 //iframe1.html <!DOCTYPE html> <html lang="en"> <head> <meta ...