ViewPager 使用方法详解

今天我们来看看ViewPager,这个控件非常实用。闲话不说,直接进入主题:

要构造ViewPager,先说几点要注意一点,ViewPager 是存在于Android的 v4 兼容包里:

android.jar 就是我们的最主要的sdk, android.support.v4.jar 就是android为了高版本sdk兼容低版本系统而创建的兼容包。 ViewPager就是一个控件,和TextView一个级别,其初始方法要使用到Adapter,我们自然联想到了ListView。那么它与ListView最大的不同就是其初始化时可以使用3中Adapter:

(1)PagerAdapter :用于初始化view,

(2)FragmentPagerAdapter:用于初始化 Fragment,

(3)FragmentStatePagerAdapter:和FragmentPagerAdapter类似,但是提供更加全面的创建和销毁功能。

接下来我们来一一介绍,先贴一张效果图:

1. 要使用ViewPager,首先需要在布局中引入控件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <android.support.v4.view.PagerTabStrip
            android:id="@+id/pagertabstrip"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >

        </android.support.v4.view.PagerTabStrip>
    </android.support.v4.view.ViewPager>

</LinearLayout>

ViewPager就是我们的控件, PagerTabStrip是title。

2.  引入控件之后, 和listview一样, 我们就需要对其添加数据. 刚刚已经介绍过, 添加数据一共有3中Adapter,先来介绍最简单的一种PagerAdapter。

我们需要继承PagerAdapter,然后重写里面的方法:

package com.xiaoming.demo01_viewpager;

import java.util.List;

import android.support.v4.view.PagerAdapter;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;

public class MyPagerAdapter extends PagerAdapter {
	private static final String TAG = "MyPagerAdapter";
	private List<View> mViewList;
	private List<String> mTitleList;

	public MyPagerAdapter(List<View> viewlist, List<String> titlelist) {
		this.mViewList = viewlist;
		this.mTitleList = titlelist;
	}

	@Override
	public int getCount() {
		return mViewList.size();
	}

	@Override
	public boolean isViewFromObject(View view, Object obj) {
		return view==obj;
	}

	@Override
	public Object instantiateItem(ViewGroup container, int position) {
		container.addView(mViewList.get(position));
		Log.d(TAG,"instantiateItem,"+"position:"+position);
		return mViewList.get(position);
	}

	@Override
	public void destroyItem(ViewGroup container, int position, Object object) {
		container.removeView(mViewList.get(position));
		Log.d(TAG,"destroyItem,"+"position:"+position);
	}

	@Override
	public CharSequence getPageTitle(int position) {
		return mTitleList.get(position);
	}

}

mViewList 是传入要显示的View列表,在MainActivity中的初始化为:

mTitleList 是传入对应每页要显示的title,在MainActivity中的初始化为:

这里需要重写的几个方法也很简单:

(1)getCount() : 获取总共页数

(2)isViewFromObject(View view, Object obj):判断view是否是指定的obj,直接参照官方api:return view==obj;

(3)instantiateItem(ViewGroup container, int position):用来初始化容器中的内容:

先是添加到容器中:container.addView(mViewList.get(position));

然后返回显示的view:return mViewList.get(position);

(4)destroyItem(ViewGroup container, int position, Object object):移除对象,并且销毁不要的对象:

   container.removeView(mViewList.get(position));

(5)getPageTitle(int position): 得到对应页的标题: return mTitleList.get(position);

5个方法都很简单,重写完之后我们就可以来加载ViewPager了:

mViewPager = (ViewPager) findViewById(R.id.viewpager);

MyPagerAdapter myadapter = new MyPagerAdapter(viewlist, titlelist);

mViewPager.setAdapter(myadapter);

这样就完成了。如果想监听viewpager变化时的时间,可以给MainActivity实现 OnPageChangeListener, 然后重写这三个方法,我们这里用最简单的toast来提示:

	@Override
	public void onPageScrollStateChanged(int arg0) {
	}

	@Override
	public void onPageScrolled(int arg0, float arg1, int arg2) {
	}

	@Override
	public void onPageSelected(int arg0) {
		showToast("当前是第" + arg0 + "页");
	}

3. 介绍完了使用PagerAdapter,我们来介绍使用Fragment填充ViewPager内容:

和使用view一样,首先需要初始化一个Fragment列表(至于fragment不在这里介绍):

然后写一个adapter继承至 FragmentPagerAdapter:

package com.xiaoming.demo01_viewpager;

import java.util.List;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;

public class MyFragmentPageAdapter extends FragmentPagerAdapter {
	private List<Fragment> mListFragment;
	private List<String> mListTitle;

	public MyFragmentPageAdapter(FragmentManager fm,
			List<Fragment> listFragment, List<String> listTitle) {
		super(fm);
		this.mListFragment = listFragment;
		this.mListTitle = listTitle;
	}

	@Override
	public Fragment getItem(int position) {
		return mListFragment.get(position);
	}

	@Override
	public int getCount() {
		return mListFragment.size();
	}

	@Override
	public CharSequence getPageTitle(int position) {
		return mListTitle.get(position);
	}

}

实现的方法主要少了两个:instantiateItem() 和 destroyItem() ,因为在使用fragment和ViewPager结合的时候,第一次加载ViewPager,就会把所有的fragment都加载进入,而且知道ViewPager销毁时才会销毁fragment列表中的fragment。 但是在使用 pageradapter的时候,一次系统加载3个view中内存中,会动态的创建和删除大于3个的部分。相面代码中也有log,大家可以参考看一下。

在MainActivity中使用:

        MyFragmentPageAdapter fadapter = new MyFragmentPageAdapter(getSupportFragmentManager(), fragmentlist, titlelist);

        mViewPager.setAdapter(fadapter);

这里需要注意,初始化 FragmentPageAdapter第一个参数是 FragmentManager,用来管理Fragmnet。获得FragmentManager有两种情况:

(1)如果使用 import android.support.v4.app.Fragment;  就是v4包中的Fragment,需要使用Activity 的 getSupportFragmentManager() 获得FragmentManager。

(2)如果使用 import android.app.Fragment; 就是正牌Fragmnet,兼容性没有那么好,直接使用Activity 的 getFragmentManager() 得到FragmentManager。

4. 使用 FragmentStatePagerAdapter 填充 :

package com.xiaoming.demo01_viewpager;

import java.util.List;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.view.ViewGroup;

public class MyFragmentStatePageAdapter extends FragmentStatePagerAdapter {
	private List<Fragment> mListFragment;
	private List<String> mListTitle;

	public MyFragmentStatePageAdapter(FragmentManager fm,
			List<Fragment> listFragment, List<String> listTitle) {
		super(fm);
		this.mListFragment = listFragment;
		this.mListTitle = listTitle;
	}

	@Override
	public Fragment getItem(int position) {
		return mListFragment.get(position);
	}

	@Override
	public int getCount() {
		return mListFragment.size();
	}

	@Override
	public CharSequence getPageTitle(int position) {
		return mListTitle.get(position);
	}

	@Override
	public void destroyItem(ViewGroup container, int position, Object object) {
		super.destroyItem(container, position, object);
	}

	@Override
	public Object instantiateItem(ViewGroup arg0, int arg1) {
		return super.instantiateItem(arg0, arg1);
	}

}

使用方法和使用FragmentPagerAdapter完全一样,就是多重写了两个方法,而且都是使用的父类的实现:

	@Override
	public void destroyItem(ViewGroup container, int position, Object object) {
		super.destroyItem(container, position, object);
	}

	@Override
	public Object instantiateItem(ViewGroup arg0, int arg1) {
		return super.instantiateItem(arg0, arg1);
	}

所以FragmentStatePagerAdapter 比 FragmentPagerAdapter 多的功能就是可以动态的管理显示和销毁fragment。

总结一下:

填充ViewPager的内容一共有3中方式:

(1)使用PagerAdapter,最简单,方便,和view结合。可以动态创建和销毁ViewPager中页的内容。

(2)使用FragmentPagerAdapter,使用fragmnet作为Viewpager内容,fragment的生命周期更加可控,所以更推荐。但是不能动态创建和销毁ViewPager中页的内容。但是这也不见得不是好事哦!

(3)FragmentStatePagerAdapter 像是PagerAdapter和FragmentPagerAdapter的结合,及使用fragment,又可以实现动态加载内容。

好了,结束!!

下面可贴上代码:

http://download.csdn.net/detail/u013647382/8329741

时间: 2024-08-04 22:27:05

ViewPager 使用方法详解的相关文章

JavaScript原生对象属性和方法详解——Array对象 转载

length 设置或返回 数组中元素的数目. 注意:设置 length 属性可改变数组的大小.如果设置的值比其当前值小,数组将被截断,其尾部的元素将丢失.如果设置的值比它的当前值大,数组将增大,新的元素被添加到数组的尾部,它们的值为 undefined.所以length不一定代表数组的元素个数. var arr = new Array(3) arr[0] = "John" arr[1] = "Andy" arr[2] = "Wendy" cons

Python数据类型及其方法详解

Python数据类型及其方法详解 我们在学习编程语言的时候,都会遇到数据类型,这种看着很基础也不显眼的东西,却是很重要,本文介绍了python的数据类型,并就每种数据类型的方法作出了详细的描述,可供知识回顾. 一.整型和长整型 整型:数据是不包含小数部分的数值型数据,比如我们所说的1.2.3.4.122,其type为"int" 长整型:也是一种数字型数据,但是一般数字很大,其type为"long" 在python2中区分整型和长整型,在32位的机器上,取值范围是-2

【转】深入学习JavaScript: apply call方法 详解(转)

Js apply方法详解 原文:http://blog.csdn.net/myhahaxiao/article/details/6952321 我在一开始看到JavaScript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这里我做如下笔记,希望和大家分享..  如有什么不对的或者说法不明确的地方希望读者多多提一些意见,以便共同提高.. 主要我是要解决一下几个问题: 1.        apply和cal

hbase-0.94安装方法详解

先决条件: 1)java环境,需要安装java1.6以上版本 2)hadoop环境,由于HBase架构是基于其他文件存储系统的,因此在分布式模式下安装Hadoop是必须的,但是,如果运行在单价模式下,此条件可以省略.Hadoop-1.2.1的安装方法参考 hadoop-1.2.1安装方法详解 注意:安装时要注意Hadoop和HBase之间的版本关系,如果不匹配,很可能会影响HBase系统的稳定性. 本帖教程采用的hadoop是hadoop-1.2.1,hbase采用的是hbase-0.94 hb

oc中字典的实现方法详解

一:字典的基本概念 Foundation中的字典(NSDictionary,NSMutableDictionary)是由键-值对组成的数据集合.正如,我们在字典里查找单词的定义一样. 通过key(键),查找的对应的value(值),key通常是字符串对象,也可以是其他任意类型对象.在一个字典对象中,key的值必须是唯一的. 此外,字典对象的键和值不可以为空(nil),如果需要在字典中加入一个空值,可以加入NSNull对象 二:不可变字典-NSDictionary 1:初始化(以一个元素和多个元素

57. 数对之差的最大值:4种方法详解与总结[maximum difference of array]

[本文链接] http://www.cnblogs.com/hellogiser/p/maximum-difference-of-array.html [题目] 在数组中,数字减去它右边的数字得到一个数对之差.求所有数对之差的最大值.例如在数组{2, 4, 1, 16, 7, 5, 11, 9}中,数对之差的最大值是11,是16减去5的结果. [分析] 看到这个题目,很多人的第一反应是找到这个数组的最大值和最小值,然后觉得最大值减去最小值就是最终的结果.这种思路忽略了题目中很重要的一点:数对之差

Java中的main()方法详解

在Java中,main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的方法有很大的不同,比如方法的名字必须是main,方法必须是public static void 类型的,方法必须接收一个字符串数组的参数等等. 在看Java中的main()方法之前,先看一个最简单的Java应用程序HelloWorld,我将通过这个例子说明Java类中main()方法的奥秘,程序的代码如下: 1 /** 2 * Java中的main()方法

查看登陆系统用户的信息的三种方法详解

查看登陆系统用户的信息的三种方法详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.who这个命令显示可以谁在登陆,但是这个有很多的花式玩法,这个命令超简单 语法:who [OPTION]... [ FILE | ARG1 ARG2 ] 1.参数:-u,显示闲置时间,若该用户在前一分钟之内有进行任何动作,将标示成"."号,如果该用户已超过24小时没有任何动作,则标示出"old"字符串. 例如: 2.参数:-m,此参数的效果和指定"a

HTTP请求方法详解

HTTP请求方法详解 请求方法:指定了客户端想对指定的资源/服务器作何种操作 下面我们介绍HTTP/1.1中可用的请求方法: [GET:获取资源]     GET方法用来请求已被URI识别的资源.指定的资源经服务器端解析后返回响应内容(也就是说,如果请求的资源是文本,那就保持原样返回:如果是CGI[通用网关接口]那样的程序,则返回经过执行后的输出结果).     最常用于向服务器查询某些信息.必要时,可以将查询字符串参数追加到URL末尾,以便将信息发送给服务器.     使用GET请求时经常会发