一起学Android之ViewPager
本文以一个简单的小例子,简述在Android开发中ViewPager的常见用法,仅供学习分享使用。
概述
ViewPager是一个支持使用者左右滑动的布局管理控件,可以通过一个实现的(适配器)PageAdapter来进行数据和页面的传递。ViewPager更多时候会和Fragment一起使用,方便管理各个页面的生命周期。
涉及知识点
- ViewPager并非是原生的UI控件,所以使用的时候需要包含全部的包名(android.support.v4.view.ViewPager)。
- PagerAdapter 是一个抽象基类,开发时需要实现类中的抽象方法。用于将数据在ViewPager中展示出来。
- 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构造函数中的一个参数。
PagerAdapter的抽象方法需要实现以下几个:
示例截图
图片轮播如下所示:

示例源码
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的更多相关文章
- Android开发学习之路-该怎么学Android(Service和Activity通信为例)
在大部分地方,比如书本或者学校和培训机构,教学Android的方式都基本类似,就是告诉先上原理方法,然后对着代码讲一下. 但是,这往往不是一个很好的方法,为什么? ① 学生要掌握这个方法的用途,只能通 ...
- 菜鸟学Android编程——简单计算器《一》
菜鸟瞎搞,高手莫进 本人菜鸟一枚,最近在学Android编程,网上看了一些视频教程,于是想着平时手机上的计算器应该很简单,自己何不尝试着做一个呢? 于是就冒冒失失的开撸了. 简单计算器嘛,功能当然很少 ...
- 学Android开发,入门语言java知识点
学Android开发,入门语言java知识点 Android是一种以Linux为基础的开源码操作系统,主要使用于便携设备,而linux是用c语言和少量汇编语言写成的,如果你想研究Android,就去学 ...
- Android中viewPager的一两点使用
Android中viewPager的一两点使用 viewPager是谷歌官方提供的一种方便实现页面滑动效果的控件,可以直接使用也可以和fragment联合使用.这里只简单说下直接使用. 使用viewP ...
- Android中ViewPager+Fragment取消(禁止)预加载延迟加载(懒加载)问题解决方案
转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53205878本文出自[DylanAndroid的博客] Android中Vie ...
- android之ViewPager
在android中ViewPager是非常常用的控件.它在android.support.v4.view.ViewPager下.你们自己可以进http://developer.android.com/ ...
- DoNet屌丝学Android(一)——Android开发准备工作 & No HelloWord & (真机)调试
先乱扯淡一下吧,本人一.net屌丝,手持Android 4.2.2手机,Win7 x64本本,闲来无聊学习一下Android的开发,至于要开发啥玩意目前没有什么想法,就是想学学,搞不好是三分热度也有可 ...
- 从头学Android系列
从头学Android系列 http://blog.csdn.net/worker90/article/category/888358
- Android listview viewpager解决冲突 滑动
Android listview viewpager滑动 跳动 冲突解决 ListView中嵌套ViewPage有或者滑动手势冲突解决 在listview 上使用 addHeaderView 在第 ...
随机推荐
- 『OGG 02』Win7 配置 Oracle GoldenGate Adapter Java 踩坑指南
上一文章 <__Win7 配置OGG(Oracle GoldenGate).docx>定下了 两个目标: 目标1: 给安装的Oracle_11g 创建 两个用户 admin 和 root ...
- “==”、“equals()”、“hashcode()”之间的秘密
前言 万丈高楼平地起,今天的聊点基础而又经常让人忽视的话题,比如“==”与“equals()”区别?为何当我们重写完"equals()"后也要有必要去重写"hashcod ...
- Asp.Net Core 轻松学-使用MariaDB/MySql/PostgreSQL和支持多个上下文对象
前言 在上一篇文章中(Asp.Net Core 轻松学-10分钟使用EFCore连接MSSQL数据库)[https://www.cnblogs.com/viter/p/10243577.html],介 ...
- 24分钟让AI跑起飞车类游戏
本文由云+社区发表 作者:WeTest小编 WeTest 导读 本文主要介绍如何让AI在24分钟内学会玩飞车类游戏.我们使用Distributed PPO训练AI,在短时间内可以取得不错的训练效果. ...
- PBFT概念与Go语言入门(Tendermint基础)
Tendermint作为当前最知名且实用的PBFT框架,网上资料并不很多,而实现Tendermint和以太坊的Go语言,由于相对小众,也存在资料匮乏和模糊错漏的问题.本文简单介绍PBFT概念和Go语言 ...
- mysql 多实例部署
Centos7.6 部署3个Mariadb 实例 [root@localhost ~]# yum install mariadb-server -y # 创建对应的目录文件 [root@localho ...
- SpaceSyntax【空间句法】之DepthMapX学习:唠叨(目录)
最近花大力气学习了空间句法这一理论,以及其相关软件DepthMapX. 我觉得吧,你要是能搜索到这理论,这一软件名,这篇博客,那我甚至都不用介绍这软件是干什么用的——好吧,还是会说一下的. 虽然不知道 ...
- Api管家系列(三):测试和Rest Client
今天我们来看一下Api管家的测试功能 在项目首页可以看到,测试过的接口和未测试的接口,点击环型图能列出相应的接口 我们选择未测试的,这些接口我都已经实现好了,只是没有用API管家进行测试,所以还显示未 ...
- 在Hyper-V上安装RemixOS 的Android模拟器
不想用实体机,想不想弄个快速的Android虚拟环境,今天我们就来说说把Android模拟器(RemixOS)安到Hyper-v上的办法. 1. 下载RemixOs 或者直接去 论坛获得下载地址 2 ...
- Windows Server 2016-Powershell之客户端加域
将本地计算机添加到域或工作组,可通过Add-Computer命令操作,具体信息如下: 语法: Add-Computer [-DomainName] <String> [-ComputerN ...