Android开发之PagerAdapter的使用

提供一个适配器用于填充ViewPager页面。首先我们来看一下PaperAdapter类,下图是来自破译android-support-v4.jar包得出的结果:

从编译的结果可以看出PagerAdapter是一个抽象类,实现具体功能需要继承这个抽象类,至少实现下面几个方法:isViewFromObject(View arg0,Object arg1)、getCount()、destroyItem(ViewGroup
container, int position, Object object)、instantiateItem(ViewGroup container, int position)几个方法,如图用红色标示的方法。各个方法的功能如下:

isViewFromObject(View, Object)

这个方法,在帮助文档中原文是could be implemented as return view == object,*也就是用于判断是否由对象生成界面

getCount()

这个方法,是获取当前窗体界面数

destroyItem(ViewGroup, int, Object)

这个方法,是从ViewGroup中移出当前View

instantiateItem(ViewGroup, int)这个方法,return一个对象,这个对象表明了PagerAdapter适配器选择哪个对象*放在当前的ViewPager中

PagerAdapter比AdapterView的使用更加普通.ViewPager使用回调函数来表示一个更新的步骤,而不是使用一个视图回收机制。在需要的时候pageradapter也可以实现视图的回收或者使用一种更为巧妙的方法来管理视图,比如采用可以管理自身视图的fragment。

viewpager不直接处理每一个视图而是将各个视图与一个键联系起来。这个键用来跟踪且唯一代表一个页面,不仅如此,该键还独立于这个页面所在adapter的位置。当pageradapter将要改变的时候他会调用startUpdate函数,接下来会调用一次或多次的instantiateItem或者destroyItem。最后在更新的后期会调用finishUpdate。当finishUpdate返回时
instantiateItem返回的对象应该添加到父ViewGroup destroyItem返回的对象应该被ViewGroup删除。methodisViewFromObject(View, Object)代表了当前的页面是否与给定的键相关联。对于非常简单的pageradapter或许你可以选择用page本身作为键,在创建并且添加到viewgroup后instantiateItem方法里返回该page本身即可destroyItem将会将该page从viewgroup里面移除。isViewFromObject方法里面直接可以返回view
== object。

pageradapter支持数据集合的改变,数据集合的改变必须要在主线程里面执行,然后还要调用notifyDataSetChanged方法。和baseadapter非常相似。数据集合的改变包括页面的添加删除和修改位置。viewpager要维持当前页面是活动的,所以你必须提供getItemPosition方法。

上面说起来有点抽象下面通过一个具体实例Samples_6_5来详细说明.

(1)新建一个Android项目Samples_6_5.

(2)在res/drawable-mdi文件下添加如图所示的图片资源。

(3)修改布局文件activity_main.xml

<?xml version="1.0" encoding="utf-8"?>

<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="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center" >

<android.support.v4.view.PagerTitleStrip

android:id="@+id/pagertitle"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="top" />

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

</LinearLayout>

(4)下面是主活动窗体的具体实现,类MainActivity

package com.example.samples_6_5;

import android.os.Bundle;

import android.app.Activity;

import android.view.Menu;

import android.support.v4.view.ViewPager;

import android.support.v4.view.PagerTitleStrip;

import java.util.ArrayList;

import android.view.View;

import android.widget.AbsoluteLayout.LayoutParams;

import android.widget.LinearLayout;

import android.widget.ImageView;

import android.support.v4.view.PagerAdapter;

import android.view.ViewGroup;

public class MainActivity extends Activity {

private ViewPager mViewPager;

private PagerTitleStrip mPaperTitleStrip;

private int[] pics={R.drawable.a,R.drawable.b,R.drawable.c};

final ArrayList<View> views=new ArrayList<View>();

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

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

mPaperTitleStrip=(PagerTitleStrip)this.findViewById(R.id.pagertitle);

LinearLayout.LayoutParams mParams=new LinearLayout.LayoutParams(

LinearLayout.LayoutParams.WRAP_CONTENT,

LinearLayout.LayoutParams.WRAP_CONTENT);

//将要分页的View装入数组中

for(int i=0;i<pics.length;i++)

{

ImageView iv=new ImageView(this);

iv.setLayoutParams(mParams);

iv.setImageResource(pics[i]);

views.add(iv);

}

//每个页面的Title数据

final ArrayList<String> titles=new ArrayList<String>();

titles.add("tab1");

titles.add("tab2");

titles.add("tab3");

//填充PagerAdapter适配器

PagerAdapter myPagerAdapter=new
PagerAdapter()

{

@Override

public boolean isViewFromObject(View arg0,Object arg1)

{

return arg0==arg1;

}

@Override

public int getCount()

{

return views.size();

}

@Override

public void destroyItem(ViewGroup container, int position, Object object)

{

((ViewGroup)container).removeView(views.get(position));

}

@Override

public CharSequence getPageTitle(int position)

{

return titles.get(position);

}

@Override

public Object instantiateItem(ViewGroup container, int position)

{

((ViewGroup)container).addView(views.get(position));

return views.get(position);

}

};

mViewPager.setAdapter(myPagerAdapter);

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.main, menu);

return true;

}

}

(5)运行结果如图所示:

a.

b.

c.

红色的代码是数据PaperAdapter的具体函数实现,至此所有的Adapter的已全部讲完,主要是实现图片标签滑动的功能。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-05 09:11:02

Android开发之PagerAdapter的使用的相关文章

Android开发之PagerAdapter

1 public class ViewPagerAdapter extends PagerAdapter { 2 3 private List<View> views; 4 private Context context; 5 6 public ViewPagerAdapter(List<View> views,Context context){ 7 this.views = views; 8 this.context = context; 9 } 10 11 @Override

Android开发之ViewPager实现轮播图(轮播广告)效果的自定义View

最近开发中需要做一个类似京东首页那样的广告轮播效果,于是采用ViewPager自己自定义了一个轮播图效果的View. 主要原理就是利用定时任务器定时切换ViewPager的页面. 效果图如下: 主页面布局实现如下: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android&

Android开发之Tween(补间动画)完全解析(下)

欢迎转载,转载请注明出处:http://blog.csdn.net/dmk877/article/details/51980734 在上一篇文章中,我们详细讨论了Tween动画的xml的实现以及interpolator的使用,相信通过上篇文章大家对Tween动画的xml属性的配置会有一个详细的理解,当然这篇文章也是承接上篇文章,所以强烈建议先阅读上篇文章:Android开发之Tween(补间动画)完全解析(上),这篇文章将从代码的角度实现上篇文章的效果.如有疑问请留言,如有谬误欢迎批评指正. T

Android开发之JSON使用

Android开发之JSON使用 今天在论坛看到有不少朋友问关于json的问题,所以想写一篇关于android中使用json的博客. 首先 json是什么 JSON的全称是JavaScript Object Notation,从这里可以看到它源于JavaScript,它采用文本形式体现.比如 {"name":"zhangsan","age":20,"wife":"如花"} 这个简单表示了一个对象,在java

Android开发之bindService()侦听service内部状态

在Android开发之bindService()通信的基础上,实现bindService()方法侦听service内部状态. 实现侦听service内部状态,使用的是回调机制 1.首先实现一个接口 1 public static interface CallBack{ 2 void onDataChange(String data); 3 } 2. 1 private CallBack callBack=null; 2 public void setCallBack(CallBack callB

Android开发之Fragment详解

Android开发之Fragment学习 1.简介: Fragment是Android 3.0引入的新API. Fragment代表了 Activity的子模块,因此可以把Fragment理解成Activity片段.Fragment用于自己的生命周期,也可以接受它自己的输入事件. Fragment必须被"嵌入" Activity中使用,因此虽然Fragment也拥有自己的生命周期,但Fragment的生命周期会受它所在的Activity的生命周期的控制.例如,当Activity暂停时,

Android开发之SpannableString详解

在实际的应用开发过程中经常会遇到,在文本的不同部分显示一些不同的字体风格的信息如:文本的字体.大小.颜色.样式.以及超级链接等.一般情况下,TextView中的文本都是一个样式,对于类似的情况,可以借助SpannableString或SpannableStringBuilder对象来实现以上设置. SpannableString与SpannableStringBuilder都可以将某段文本设置成一个Span,在Android中,Span表示一段文本的效果,例如,链接形式.图像.带背景的文本等.只

Android开发之Html类详解

在进行Android开发中经常回忽略Html类.这个类其实很简单,就是将HTML标签文本解析成普通的样式文本.下面就让我么看一下这个类的具体介绍. 类结构: java.lang.Object    ? android.text.Html 类概述: 这个类用于处理的HTML字符串并将其转换成可显示的样式文本.但并不是所有的HTML标记的支持. 公有方法: 说其简单是应为它就有四个方法: Public Methods static String escapeHtml(CharSequence tex

Android开发之View重写相关API-onLayout,onMeasure,MeasureSpec

 1.onLayout android.view.ViewGroup protected void onLayout(boolean changed, int l, int t, int r, int b) 执行layout操作时调用onLayout方法.View要给它的每个Child设定size和position.拥有Children的子类需要重写onLayout方法并且调用每个Child的layout方法. 参数changed表示view的size或position发生变化.参数l, t,