本文以一个简单的小例子,简述在Android开发中ViewPager的常见用法,仅供学习分享使用。

概述

ViewPager是一个支持使用者左右滑动的布局管理控件,可以通过一个实现的(适配器)PageAdapter来进行数据和页面的传递。ViewPager更多时候会和Fragment一起使用,方便管理各个页面的生命周期。

涉及知识点

  • ViewPager并非是原生的UI控件,所以使用的时候需要包含全部的包名(android.support.v4.view.ViewPager)。
  • PagerAdapter 是一个抽象基类,开发时需要实现类中的抽象方法。用于将数据在ViewPager中展示出来。
  • PagerAdapter的抽象方法需要实现以下几个:

    • getCount() 用于获取需要展示的子视图的数量
    • isViewFromObject(View view, Object object) 子视图是否需要重新加载,如果已经加载过,则不需要重新加载。
    • destroyItem(ViewGroup container, int position, Object object) 删除子视图
    • instantiateItem(ViewGroup container, int position) 生成对应位置的子视图
  • addOnPageChangeListener 对ViewPager增加监听事件
  • SimpleOnPageChangeListener 是实现OnPageChangeListener接口的类,需要实现onPageSelected(int position)方法即可。
  • ImageView 图片视图,用于显示图片,本例中主要用于ViewPager中的指示器。
  • FragmentPagerAdapter 用于显示Fragment的适配器。
  • FragmentManager 一个用于管理Fragmetn的抽象类,是FragmentPagerAdapter构造函数中的一个参数。

示例截图

图片轮播如下所示:

示例源码

xml布局代码

 <?xml version="1.0" encoding="utf-8"?>
<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"
tools:context="com.hex.demoviewpager.MainActivity">
<android.support.v4.view.ViewPager
android:id="@+id/vp_info"
android:scrollIndicators="bottom"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v4.view.ViewPager>
<TextView
android:id="@+id/tv_title"
android:layout_alignBottom="@id/vp_info"
android:layout_centerHorizontal="true"
android:textSize="20dp"
android:text="aaaa"
android:layout_marginBottom="30dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<LinearLayout
android:id="@+id/ll_Indicator"
android:layout_alignBottom="@id/vp_info"
android:layout_centerHorizontal="true"
android:gravity="center"
android:orientation="horizontal"
android:layout_width="200dp"
android:layout_height="wrap_content"> </LinearLayout>
<Button
android:id="@+id/bn_go"
android:text="@string/go"
android:layout_alignParentTop="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</RelativeLayout>

Java代码(图片轮播)

 package com.hex.demoviewpager;

 import android.content.Intent;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView; public class MainActivity extends AppCompatActivity { private ViewPager mViewPager;
int[] imgs;
String[] titles;
TextView tvTitle;
LinearLayout llIndicator;
Button mGo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mViewPager= (ViewPager) this.findViewById(R.id.vp_info);
imgs=new int[]{R.drawable.s01,R.drawable.s02,R.drawable.s03,R.drawable.s04,R.drawable.s05};
titles=new String[]{"第一张图","第二张图","第三张图","第四张图","第五张图"};
tvTitle= (TextView) this.findViewById(R.id.tv_title);
//构造适配器并赋值
MyAdapter adapter=new MyAdapter();
mViewPager.setAdapter(adapter);
//初始化第一个标题
tvTitle.setText(titles[0]);
//初始化指示器
llIndicator = (LinearLayout) this.findViewById(R.id.ll_Indicator);
setIndicator(0);
//设置页面切换监听事件
mViewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
/**
* 页面被选中
* @param position
*/
@Override
public void onPageSelected(int position) {
Log.v("DemoViewPager","当前是:"+titles[position]);
tvTitle.setText(titles[position]);
//设置指示器
llIndicator.removeAllViews();
setIndicator(position);
}
});
//页面跳转
mGo= (Button) this.findViewById(R.id.bn_go);
mGo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this,Main2Activity.class);
startActivity(intent);
}
});
} /**
* 设置指示器
* @param position
*/
private void setIndicator(int position){
for(int i=0;i<imgs.length;i++) {
ImageView imgIndicatior = new ImageView(MainActivity.this);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(10, 10);
layoutParams.leftMargin = 10;
layoutParams.rightMargin = 10;
imgIndicatior.setLayoutParams(layoutParams);
if (i == position) {
imgIndicatior.setImageResource(R.drawable.dot1);
} else {
imgIndicatior.setImageResource(R.drawable.dot0);
}
llIndicator.addView(imgIndicatior);
}
} /*
描述:自定义一适配器
*/
class MyAdapter extends PagerAdapter
{ @Override
public int getCount() {
return imgs == null ? 0 : imgs.length;
} /**
* 是否需要重新加载子视图
* @param view
* @param object
* @return
*/
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
} @Override
public void destroyItem(ViewGroup container, int position, Object object) {
//container.removeViewAt(position);
container.removeView((View)object);
} /**
* 生成子视图
* @param container
* @param position
* @return
*/
@Override
public Object instantiateItem(ViewGroup container, int position) {
ImageView img=new ImageView(container.getContext());
img.setImageResource(imgs[position]);
container.addView(img);
return img;
} @Override
public CharSequence getPageTitle(int position) {
return titles[position];
}
}
}

Java代码(Fragment滑动)

 package com.hex.demoviewpager;

 import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.ImageView;
import android.widget.LinearLayout; import java.util.ArrayList;
import java.util.List; public class Main2Activity extends FragmentActivity { private ViewPager mViewPager2;
private List<Fragment> mList;
LinearLayout llIndicator2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
mViewPager2= (ViewPager) this.findViewById(R.id.vp_info2);
mList=new ArrayList<Fragment>();
for(int i=0;i<5;i++){
ContentFragment fragment=ContentFragment.newInstance("第 "+i+" 个Fragment");
mList.add(fragment);
}
FragmentManager manager = getSupportFragmentManager();
MyAdapter2 adapter2=new MyAdapter2(manager);
mViewPager2.setAdapter(adapter2);
//初始化指示器
llIndicator2 = (LinearLayout) this.findViewById(R.id.ll_Indicator2);
setIndicator(0);
//设置页面切换监听事件
mViewPager2.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
/**
* 页面被选中
* @param position
*/
@Override
public void onPageSelected(int position) {
//设置指示器
llIndicator2.removeAllViews();
setIndicator(position);
}
});
} /**
* 设置指示器
* @param position
*/
private void setIndicator(int position){
for(int i=0;i<mList.size();i++) {
ImageView imgIndicatior = new ImageView(Main2Activity.this);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(10, 10);
layoutParams.leftMargin = 10;
layoutParams.rightMargin = 10;
imgIndicatior.setLayoutParams(layoutParams);
if (i == position) {
imgIndicatior.setImageResource(R.drawable.dot1);
} else {
imgIndicatior.setImageResource(R.drawable.dot0);
}
llIndicator2.addView(imgIndicatior);
}
} /**
* 结合Fragement的适配器
*/
class MyAdapter2 extends FragmentPagerAdapter{ public MyAdapter2(FragmentManager fm) {
super(fm); } @Override
public int getCount() {
return mList==null ? 0:mList.size();
} @Override
public Fragment getItem(int position) {
return mList.get(position);
}
}
}

备注

ViewPager支持的Fragment也是android.support.v4.app包中的Fragment,需要调用的Activity也是需要继承android.support.v4.app.FragmentActivity 。ViewPager中的图片指示器是用LinearLayout中图片实现的。

一起学Android之ViewPager的更多相关文章

  1. Android开发学习之路-该怎么学Android(Service和Activity通信为例)

    在大部分地方,比如书本或者学校和培训机构,教学Android的方式都基本类似,就是告诉先上原理方法,然后对着代码讲一下. 但是,这往往不是一个很好的方法,为什么? ① 学生要掌握这个方法的用途,只能通 ...

  2. 菜鸟学Android编程——简单计算器《一》

    菜鸟瞎搞,高手莫进 本人菜鸟一枚,最近在学Android编程,网上看了一些视频教程,于是想着平时手机上的计算器应该很简单,自己何不尝试着做一个呢? 于是就冒冒失失的开撸了. 简单计算器嘛,功能当然很少 ...

  3. 学Android开发,入门语言java知识点

    学Android开发,入门语言java知识点 Android是一种以Linux为基础的开源码操作系统,主要使用于便携设备,而linux是用c语言和少量汇编语言写成的,如果你想研究Android,就去学 ...

  4. Android中viewPager的一两点使用

    Android中viewPager的一两点使用 viewPager是谷歌官方提供的一种方便实现页面滑动效果的控件,可以直接使用也可以和fragment联合使用.这里只简单说下直接使用. 使用viewP ...

  5. Android中ViewPager+Fragment取消(禁止)预加载延迟加载(懒加载)问题解决方案

    转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53205878本文出自[DylanAndroid的博客] Android中Vie ...

  6. android之ViewPager

    在android中ViewPager是非常常用的控件.它在android.support.v4.view.ViewPager下.你们自己可以进http://developer.android.com/ ...

  7. DoNet屌丝学Android(一)——Android开发准备工作 & No HelloWord & (真机)调试

    先乱扯淡一下吧,本人一.net屌丝,手持Android 4.2.2手机,Win7 x64本本,闲来无聊学习一下Android的开发,至于要开发啥玩意目前没有什么想法,就是想学学,搞不好是三分热度也有可 ...

  8. 从头学Android系列

    从头学Android系列 http://blog.csdn.net/worker90/article/category/888358

  9. Android listview viewpager解决冲突 滑动

    Android listview viewpager滑动 跳动 冲突解决 ListView中嵌套ViewPage有或者滑动手势冲突解决   在listview 上使用 addHeaderView 在第 ...

随机推荐

  1. es6学习笔记-class之继承

    继承 上一篇学习了class的概念,在es5时,对象的继承有好几种,原型链继承,借用构造函数继承,组合继承,原型式继承,寄生式继承以及寄生组合式继承,都是按照函数的形式去集成的,现在class也有它的 ...

  2. MyISAM加锁分析

    为什么加锁 你正在读着你喜欢的女孩递给你的信,看到一半的时候,她的好闺蜜过来瞄了一眼(假设她会隐身术,你看不到她),她想把"我很喜欢你"改成"我不喜欢你",刚把 ...

  3. COW奶牛!Copy On Write机制了解一下

    前言 只有光头才能变强 在读<Redis设计与实现>关于哈希表扩容的时候,发现这么一段话: 执行BGSAVE命令或者BGREWRITEAOF命令的过程中,Redis需要创建当前服务器进程的 ...

  4. asp.net mvc 三层加EF两表联查

    首先打开vs软件新建项目创建web中的mvc项目再右击解决方案创建类库项目分别创建DAL层和BLL层再把DAL层和BLL层的类重命名在mvc项目中的Models文件夹创建model类在DAL创建ADO ...

  5. c#发送邮件,可发送多个附件

    1:创建SendMail类 2:调用方法 SendMail send = new SendMail("123456@qq.com", "123456@163.com&qu ...

  6. C#动态调用泛型类、泛型方法

    在制作一个批量序列化工具时遇到了如下问题,在此记录一下,仅供参考. 主程序加载另一个程序集,将其中的所有类取出,然后对这些类分别调用泛型类或泛型方法.控制台程序解决方案如下: Main工程:提供Wor ...

  7. canvas实现画板

    canvas实现画板 主要用到知识点: 鼠标事件onmousedown() onmousemove() onmouseup() onmouseleave() 事件委托 canvas的一些方法 如:绘制 ...

  8. Win64下编译集成GEOS和Proj4的GDAL

    目录 1.编译GEOS 2.编译Proj4 3.GDAL集成Proj4和GEOS 1) 修改安装的目录 2) 配置Proj4 3) 配置GEOS 4) 自定义动态库名称(可跳过) 5) 编译 1.编译 ...

  9. android---动画入门(一)

    android 动画分为两类,View Animation(视图动画)和property Animation(属性动画),View Animation(视图动画)包含了Tween Animation和 ...

  10. break、continue以及return的区别

    break.continue以及return的区别如下: 1.break break用于完全结束一个循环,跳出循环体,不再执行下面的代码.对于多层循环嵌套,如果break语句出现在嵌套循环中的内循环时 ...