本文以一个简单的小例子,简述在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 Boot 定义系统启动任务,你会几种方式?

    在 Servlet/Jsp 项目中,如果涉及到系统任务,例如在项目启动阶段要做一些数据初始化操作,这些操作有一个共同的特点,只在项目启动时进行,以后都不再执行,这里,容易想到web基础中的三大组件( ...

  2. ORM 开发环境之利器:MVC 中间件 FreeSql.AdminLTE

    前言 这是一篇纯技术干货的分享文章,FreeSql 已经基本完成 .NETCore 最方便的 ORM 使命,我们正在筹备生态的建立,比如 ABP 中如何使用 FreeSql 的实现,需要各种各样的扩展 ...

  3. python爬虫踩坑教程

    我们的目标是爬取下面这个个网址上的2010~2018年的数据 http://stockdata.stock.hexun.com/zrbg/Plate.aspx?date=2015-12-31 获取我们 ...

  4. 程序猿必知必会Linux命令之awk

    前言 对于一名专业的程序员来说,Linux相关知识是必须要掌握的,其中对于文本的处理更是我们常见的操作,比如格式化输出我们需要的数据,这些数据可能会来源于文本文件或管道符,或者统计文本里面我们需要的数 ...

  5. .Net 反射学习

    Why?为什么使用反射 MVC ORM EF 都是用的反射.反射可以让程序的扩展性,灵活性得到加强.一起即可动态创建   what 反射原理    动态加载类库 ,先添加引用类库,或者复制debug里 ...

  6. Shiro详解

    Shiro Shiro集成Spring 加入Spring和Shiro的jar包 配置Spring及SpringMVC 参照:官方给出的案例shiro\samples\spring Shiro集成Web ...

  7. 正向代理&反向代理 简(fu)明(za)解释

    最近写的东西越来越偏向Web程序员了··· 你想读懂本篇,就要知道什么是Web服务器——装在世界上某个机房里某台机器里某个操作系统里的一个,对外(公网或者你能访问)服务各种你需要的信息的软件! 它可以 ...

  8. C# 将datatable导出成Excel

    public void Result( ){try{StringBuilder sql = new StringBuilder();List<SqlParameter> parameter ...

  9. 吴恩达机器学习笔记58-协同过滤算法(Collaborative Filtering Algorithm)

    在之前的基于内容的推荐系统中,对于每一部电影,我们都掌握了可用的特征,使用这些特征训练出了每一个用户的参数.相反地,如果我们拥有用户的参数,我们可以学习得出电影的特征. 但是如果我们既没有用户的参数, ...

  10. Python后台开发Django(启动)

    Django版本为:2.1.7 Python的web框架,MTV思想 MVC Model(模板文件,数据库操作)  view(视图模板文件  )controller(业务处理) MTV Model(模 ...