本文以一个简单的小例子,简述在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. Spring-Data-JPA尝鲜:快速搭建CRUD+分页后台实例

    前言:由于之前没有接触过Hibernate框架,但是最近看一些博客深深被它的"效率"所吸引,所以这就来跟大家一起就着一个简单的例子来尝尝Spring全家桶里自带的JPA的鲜 Spr ...

  2. headfirst设计模式(9)—模板方法模式

    前言 这一章的模板方法模式,个人感觉它是一个简单,并且实用的设计模式,先说说它的定义: 模板方法模式定义了一个算法的步骤,并允许子类别为一个或多个步骤提供其实践方式.让子类别在不改变算法架构的情况下, ...

  3. wow.js让css3动画变动更有趣(滚动页面动画模拟懒加载特效)

    CSS3的出现给网站页面增加了活力,网站增色不少,有这么小小的一款插件就能做出很多动画效果. 最重要的是它:简单易用.轻量级.无需 jQuery......他就是wow.js 地址:https://d ...

  4. Hello World 程序的起源与历史

    这是一个最著名的程序.对每一位程序员来说,这个程序几乎是每一门编程语言中的第一个示例程序.那么,这个著名的程序究竟从何而来呢? 实际上,这个程序的功能只是告知计算机显示 Hello World 这句话 ...

  5. Linux 开启和关闭 Ping 操作

    Linux 默认是开启 ping 操作的,通过以下两种方式可以开启和关闭 ping 操作 . 1.修改内核参数 通过内核参数设置也有两种方式,一种是临时修改,一种是永久修改. 1.1 临时设置 PIN ...

  6. Java核心技术第八章——泛型程序设计(1)

    1.泛型程序设计 泛型程序设计意味着编写的代码可以被很多不同类型的对象所重用.例如:不希望为了聚集String和Integer对象分别设计不同的类.(个人觉得此处说的聚集译为:创建一个对象,属性可以为 ...

  7. 腾讯云服务器搭建Apache/PHP/MySQL环境

    软件环境 Windows Server 2008 R2 企业版 SP1 64位 刚刚进入 Windows Server ,你会看到以下界面: 列出了服务器的基础信息和常用配置 下载 XAMPP htt ...

  8. css两列布局之基于BFC规则实现

    css要实现常见的自适应两列布局的方式方法挺多. 这里讲的是利用设置overflow不为visible时会形成新的BFC来实现.至于什么是BFC,可以搜搜看先,基本都讲的差不多了.等有更多空余时间,专 ...

  9. 轻量级数据库Sqlite的使用

    SqLite是什么? SQLite是一个进程内的库,实现了自给自足的.无服务器的.零配置的.事务性的 SQL 数据库引擎.它是一个零配置的数据库,这意味着与其他数据库一样,您不需要在系统中配置. 就像 ...

  10. docker~docker-compose的使用

    回到目录 docker-compose是用来在Docker中定义和运行复杂应用的工具,比如在一个yum文件里定义多个容器,只用一行命令就可以让一切就绪并运行. 使用docker compose我们可以 ...