本文以一个简单的小例子,简述在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. 『OGG 02』Win7 配置 Oracle GoldenGate Adapter Java 踩坑指南

    上一文章 <__Win7 配置OGG(Oracle GoldenGate).docx>定下了 两个目标: 目标1: 给安装的Oracle_11g 创建 两个用户 admin 和 root ...

  2. “==”、“equals()”、“hashcode()”之间的秘密

    前言 万丈高楼平地起,今天的聊点基础而又经常让人忽视的话题,比如“==”与“equals()”区别?为何当我们重写完"equals()"后也要有必要去重写"hashcod ...

  3. Asp.Net Core 轻松学-使用MariaDB/MySql/PostgreSQL和支持多个上下文对象

    前言 在上一篇文章中(Asp.Net Core 轻松学-10分钟使用EFCore连接MSSQL数据库)[https://www.cnblogs.com/viter/p/10243577.html],介 ...

  4. 24分钟让AI跑起飞车类游戏

    本文由云+社区发表 作者:WeTest小编 WeTest 导读 本文主要介绍如何让AI在24分钟内学会玩飞车类游戏.我们使用Distributed PPO训练AI,在短时间内可以取得不错的训练效果. ...

  5. PBFT概念与Go语言入门(Tendermint基础)

    Tendermint作为当前最知名且实用的PBFT框架,网上资料并不很多,而实现Tendermint和以太坊的Go语言,由于相对小众,也存在资料匮乏和模糊错漏的问题.本文简单介绍PBFT概念和Go语言 ...

  6. mysql 多实例部署

    Centos7.6 部署3个Mariadb 实例 [root@localhost ~]# yum install mariadb-server -y # 创建对应的目录文件 [root@localho ...

  7. SpaceSyntax【空间句法】之DepthMapX学习:唠叨(目录)

    最近花大力气学习了空间句法这一理论,以及其相关软件DepthMapX. 我觉得吧,你要是能搜索到这理论,这一软件名,这篇博客,那我甚至都不用介绍这软件是干什么用的——好吧,还是会说一下的. 虽然不知道 ...

  8. Api管家系列(三):测试和Rest Client

    今天我们来看一下Api管家的测试功能 在项目首页可以看到,测试过的接口和未测试的接口,点击环型图能列出相应的接口 我们选择未测试的,这些接口我都已经实现好了,只是没有用API管家进行测试,所以还显示未 ...

  9. 在Hyper-V上安装RemixOS 的Android模拟器

    不想用实体机,想不想弄个快速的Android虚拟环境,今天我们就来说说把Android模拟器(RemixOS)安到Hyper-v上的办法. 1. 下载RemixOs  或者直接去 论坛获得下载地址 2 ...

  10. Windows Server 2016-Powershell之客户端加域

    将本地计算机添加到域或工作组,可通过Add-Computer命令操作,具体信息如下: 语法: Add-Computer [-DomainName] <String> [-ComputerN ...