之前的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. CSS------如何让大小不一样的div顶部对齐

    方法一:(推荐) <div style="float:left;margin-right:20px"> <img src="/source/s_1701 ...

  2. AngularJs指令配置参数scope详解

    AngularJs最重要也是最难理解的模块之一就是它的指令(directive)了,自定义指令配置有很多个参数,下面我只说说其中scope的配置极其含义. scope表示指令的作用域,它有三个可选值: ...

  3. SpringMVC框架03——数据绑定

    1.绑定基本数据类型 在Controller类中添加业务方法: /** * 绑定基本数据类型 */ @RequestMapping("/baseType") @ResponseBo ...

  4. react初始化阶段

    初始化阶段可以使用的函数:getDefaultProps:只调用一次,实例之间共享引用.只有在组件的第一个实例被初始化的时候,才会调用他,然后react会把这个函数的返回结果保存起来,从第二个实例开始 ...

  5. BZOJ.4072.[SDOI2016]征途(DP 斜率优化)

    题目链接 题目要求使得下面这个式子最小(\(\mu=\frac{\sum_{i=1}^ma_i}{m}\)是平均数,\(a_i\)为第\(i\)段的和): \[\frac{\sum_{i-1}^m(\ ...

  6. 「GIT SourceTree冲突」解决方案

    现在程序猿标配GIT作为代码管理,但是从SVN到GIT学习中,其中GIT的冲突是一个难点,常常会导致Push不上去,Pull不下来,很尴尬的地步,还不知道自己写的代码被覆盖没,废话不多说,直接上干货! ...

  7. SSH 证书登录(实例详解)

    SSH 证书登录(实例详解) 客户端通过私钥登录 ssh 服务器 CentOS 7 SSH 使用证书登录 使用私钥 ssh 登陆 CentOS

  8. 【DevOps】谁说大象不能跳舞?

    作者:范军 (Frank Fan) 新浪微博:@frankfan7   微信:frankfan7 很多企业,尤其是大企业在产品开发和运维上存在着一些普遍问题,比如开发周期长.人员合作程度不高.开发和运 ...

  9. [Winform]Media Player com组件应用中遇到的问题

    摘要 最近一个项目中,需要用到在客户端全屏循环播放视频,当时考虑使用开源的播放器,但控制起来不方便,然后考虑既然都是windows系统,那么可以考虑使用微软自带的Media Player播放器.所以在 ...

  10. hdu 4865 Peter&#39;s Hobby

    Peter's Hobby Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...