一起学Android之ViewPager

本文以一个简单的小例子,简述在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布局代码

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <RelativeLayout
 3     xmlns:android="http://schemas.android.com/apk/res/android"
 4     xmlns:tools="http://schemas.android.com/tools"
 5     android:layout_width="match_parent"
 6     android:layout_height="match_parent"
 7     tools:context="com.hex.demoviewpager.MainActivity">
 8     <android.support.v4.view.ViewPager
 9         android:id="@+id/vp_info"
10         android:scrollIndicators="bottom"
11         android:layout_width="match_parent"
12         android:layout_height="match_parent">
13     </android.support.v4.view.ViewPager>
14     <TextView
15         android:id="@+id/tv_title"
16         android:layout_alignBottom="@id/vp_info"
17         android:layout_centerHorizontal="true"
18         android:textSize="20dp"
19         android:text="aaaa"
20         android:layout_marginBottom="30dp"
21         android:layout_width="wrap_content"
22         android:layout_height="wrap_content"/>
23     <LinearLayout
24         android:id="@+id/ll_Indicator"
25         android:layout_alignBottom="@id/vp_info"
26         android:layout_centerHorizontal="true"
27         android:gravity="center"
28         android:orientation="horizontal"
29         android:layout_width="200dp"
30         android:layout_height="wrap_content">
31
32     </LinearLayout>
33     <Button
34         android:id="@+id/bn_go"
35         android:text="@string/go"
36         android:layout_alignParentTop="true"
37         android:layout_width="wrap_content"
38         android:layout_height="wrap_content"/>
39 </RelativeLayout>

Java代码(图片轮播)

  1 package com.hex.demoviewpager;
  2
  3 import android.content.Intent;
  4 import android.support.v4.view.PagerAdapter;
  5 import android.support.v4.view.ViewPager;
  6 import android.support.v7.app.ActionBar;
  7 import android.support.v7.app.AppCompatActivity;
  8 import android.os.Bundle;
  9 import android.util.Log;
 10 import android.view.View;
 11 import android.view.ViewGroup;
 12 import android.widget.Button;
 13 import android.widget.ImageView;
 14 import android.widget.LinearLayout;
 15 import android.widget.TextView;
 16
 17 public class MainActivity extends AppCompatActivity {
 18
 19     private ViewPager mViewPager;
 20     int[] imgs;
 21     String[] titles;
 22     TextView tvTitle;
 23     LinearLayout llIndicator;
 24     Button mGo;
 25     @Override
 26     protected void onCreate(Bundle savedInstanceState) {
 27         super.onCreate(savedInstanceState);
 28         setContentView(R.layout.activity_main);
 29         mViewPager= (ViewPager) this.findViewById(R.id.vp_info);
 30         imgs=new int[]{R.drawable.s01,R.drawable.s02,R.drawable.s03,R.drawable.s04,R.drawable.s05};
 31         titles=new String[]{"第一张图","第二张图","第三张图","第四张图","第五张图"};
 32         tvTitle= (TextView) this.findViewById(R.id.tv_title);
 33         //构造适配器并赋值
 34         MyAdapter adapter=new MyAdapter();
 35         mViewPager.setAdapter(adapter);
 36         //初始化第一个标题
 37         tvTitle.setText(titles[0]);
 38         //初始化指示器
 39         llIndicator = (LinearLayout) this.findViewById(R.id.ll_Indicator);
 40         setIndicator(0);
 41         //设置页面切换监听事件
 42         mViewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
 43             /**
 44              * 页面被选中
 45              * @param position
 46              */
 47             @Override
 48             public void onPageSelected(int position) {
 49                 Log.v("DemoViewPager","当前是:"+titles[position]);
 50                 tvTitle.setText(titles[position]);
 51                 //设置指示器
 52                 llIndicator.removeAllViews();
 53                 setIndicator(position);
 54             }
 55         });
 56         //页面跳转
 57         mGo= (Button) this.findViewById(R.id.bn_go);
 58         mGo.setOnClickListener(new View.OnClickListener() {
 59             @Override
 60             public void onClick(View v) {
 61                 Intent intent=new Intent(MainActivity.this,Main2Activity.class);
 62                 startActivity(intent);
 63             }
 64         });
 65     }
 66
 67     /**
 68      * 设置指示器
 69      * @param position
 70      */
 71     private  void setIndicator(int position){
 72         for(int i=0;i<imgs.length;i++) {
 73             ImageView imgIndicatior = new ImageView(MainActivity.this);
 74             LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(10, 10);
 75             layoutParams.leftMargin = 10;
 76             layoutParams.rightMargin = 10;
 77             imgIndicatior.setLayoutParams(layoutParams);
 78             if (i == position) {
 79                 imgIndicatior.setImageResource(R.drawable.dot1);
 80             } else {
 81                 imgIndicatior.setImageResource(R.drawable.dot0);
 82             }
 83             llIndicator.addView(imgIndicatior);
 84         }
 85     }
 86
 87     /*
 88     描述:自定义一适配器
 89      */
 90     class MyAdapter extends PagerAdapter
 91     {
 92
 93         @Override
 94         public int getCount() {
 95             return imgs == null ? 0 : imgs.length;
 96         }
 97
 98         /**
 99          * 是否需要重新加载子视图
100          * @param view
101          * @param object
102          * @return
103          */
104         @Override
105         public boolean isViewFromObject(View view, Object object) {
106             return view == object;
107         }
108
109         @Override
110         public void destroyItem(ViewGroup container, int position, Object object) {
111             //container.removeViewAt(position);
112             container.removeView((View)object);
113         }
114
115         /**
116          * 生成子视图
117          * @param container
118          * @param position
119          * @return
120          */
121         @Override
122         public Object instantiateItem(ViewGroup container, int position) {
123             ImageView img=new ImageView(container.getContext());
124             img.setImageResource(imgs[position]);
125             container.addView(img);
126             return  img;
127         }
128
129         @Override
130         public CharSequence getPageTitle(int position) {
131             return titles[position];
132         }
133     }
134 }

Java代码(Fragment滑动)

 1 package com.hex.demoviewpager;
 2
 3 import android.support.v4.app.Fragment;
 4 import android.support.v4.app.FragmentActivity;
 5 import android.support.v4.app.FragmentManager;
 6 import android.support.v4.app.FragmentPagerAdapter;
 7 import android.support.v4.view.ViewPager;
 8 import android.support.v7.app.AppCompatActivity;
 9 import android.os.Bundle;
10 import android.util.Log;
11 import android.widget.ImageView;
12 import android.widget.LinearLayout;
13
14 import java.util.ArrayList;
15 import java.util.List;
16
17 public class Main2Activity extends FragmentActivity {
18
19     private ViewPager mViewPager2;
20     private   List<Fragment> mList;
21     LinearLayout llIndicator2;
22     @Override
23     protected void onCreate(Bundle savedInstanceState) {
24         super.onCreate(savedInstanceState);
25         setContentView(R.layout.activity_main2);
26         mViewPager2= (ViewPager) this.findViewById(R.id.vp_info2);
27         mList=new ArrayList<Fragment>();
28         for(int i=0;i<5;i++){
29             ContentFragment fragment=ContentFragment.newInstance("第 "+i+" 个Fragment");
30             mList.add(fragment);
31         }
32         FragmentManager manager = getSupportFragmentManager();
33         MyAdapter2 adapter2=new MyAdapter2(manager);
34         mViewPager2.setAdapter(adapter2);
35         //初始化指示器
36         llIndicator2 = (LinearLayout) this.findViewById(R.id.ll_Indicator2);
37         setIndicator(0);
38         //设置页面切换监听事件
39         mViewPager2.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
40             /**
41              * 页面被选中
42              * @param position
43              */
44             @Override
45             public void onPageSelected(int position) {
46                 //设置指示器
47                 llIndicator2.removeAllViews();
48                 setIndicator(position);
49             }
50         });
51     }
52
53     /**
54      * 设置指示器
55      * @param position
56      */
57     private  void setIndicator(int position){
58         for(int i=0;i<mList.size();i++) {
59             ImageView imgIndicatior = new ImageView(Main2Activity.this);
60             LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(10, 10);
61             layoutParams.leftMargin = 10;
62             layoutParams.rightMargin = 10;
63             imgIndicatior.setLayoutParams(layoutParams);
64             if (i == position) {
65                 imgIndicatior.setImageResource(R.drawable.dot1);
66             } else {
67                 imgIndicatior.setImageResource(R.drawable.dot0);
68             }
69             llIndicator2.addView(imgIndicatior);
70         }
71     }
72
73     /**
74      * 结合Fragement的适配器
75      */
76     class MyAdapter2 extends FragmentPagerAdapter{
77
78         public MyAdapter2(FragmentManager fm) {
79             super(fm);
80
81         }
82
83         @Override
84         public int getCount() {
85             return mList==null ? 0:mList.size();
86         }
87
88         @Override
89         public Fragment getItem(int position) {
90             return mList.get(position);
91         }
92     }
93 }

备注

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

原文地址:https://www.cnblogs.com/hsiang/p/10328332.html

时间: 2024-08-12 22:39:28

一起学Android之ViewPager的相关文章

一起学android之ViewPager讲解(11)

ViewPager的功能提供界面切换的效果,我们可以定义一组VIEW,在当前界面中进行左右切换它们. 使用ViewPager时我们需要以下准备: 1.准备适配器: <span style="font-size:18px;">PagerAdapter mPagerAdapter=new PagerAdapter() { @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0

处女男学Android(十一)---Gallery、ViewPager和ViewPager+Fragment实现的Tab导航

一.前言 有阵子没更新博客了,主要是最近公司接了个P2P的金融借贷项目没人做,被拉去写服务端,所以迟迟没时间继续学习大安卓,想了想自己的安卓水平和公司的专业安卓璟博比起来依旧差距挺大,于是乎我要加把劲赶上才行,所以继续翻开李刚疯狂讲义系列,看到Gallery这个控件了,大致功能是横向滚动查看列表项,再仔细看了一下居然过时了,官方推荐用ViewPager来替代,还没学就过时了,有点不爽,干脆新的旧的一起学习一下,也好进行一下比较吧.废话不多说,首先是已经过时的Gallery. 二.画廊视图Gall

一起学android之利用回调函数onCreateDialog实现加载对话框(23)

效果图: 有时候我们需要去做一个Activity启动时的数据加载对话框,关于对话框的各种实现可以通过一起学android之对话框 Dialog的创建(7)来完成,在这里另外介绍一个,利用onCreateDialog回调方法来实现,当然这个方法标记已经过 时了,但我们还是可以使用这个方法来实现我们想要的功能.具体请参看代码: public class MainActivity extends Activity { @SuppressWarnings("deprecation") @Ove

从零开始学android&lt;android事件的处理方式.二十四.&gt;

在android中一共有 多种事件,每种事件都有自己相对应的处理机制 如以下几种 1 单击事件 View.OnClickListener public abstract void onClick (View v) 单击组件时触发 2 单击事件 View.OnLongClickListener public abstract boolean onLongClick (View v) 长按组件时触发 3 键盘事件 View.OnKeyListener public abstract boolean

Android:ViewPager扩展详解——带有导航的ViewPagerIndicator(附带图片缓存,异步加载图片)

大家都用过viewpager了, github上有对viewpager进行扩展,导航风格更加丰富,这个开源项目是ViewPagerIndicator,很好用,但是例子比较简单,实际用起来要进行很多扩展,比如在fragment里进行图片缓存和图片异步加载. 下面是ViewPagerIndicator源码运行后的效果,大家也都看过了,我多此一举截几张图: 下载源码请点击这里 ===========================================华丽的分割线==============

从零开始学android&lt;RatingBar评分组件.二十三.&gt;

如果现在用户要对某个应用程序打分往往会使用图所示的组件,通过选择的"五角星"的个数来决定最终的打分成绩 这样的功能在Android之中,可以使用RatingBar组件实现,使用此组件可以方便用户的输入,而且很直观,RatingBar类的定义结构如下: java.lang.Object ? android.view.View ? android.widget.ProgressBar ? android.widget.AbsSeekBar ? android.widget.RatingBa

从零开始学android&lt;AutoCompleteTextView随笔提示文本框.十九.&gt;

随笔提示功能可以很好的帮助用户进行方便的信息输入,而在Android之中也提供了与之类似的功能,而这个功能的实现就需要依靠android.widget.AutoCompleteTextView类完成,此类的继承结构如下: java.lang.Object ? android.view.View ? android.widget.TextView ? android.widget.EditText ? android.widget.AutoCompleteTextView No. 方法 类型 描述

从零开始学android&lt;使用嵌套布局实现计算器界面.十七.&gt;

所谓的嵌套布局就是在一个文件中嵌套多个布局文件 <span style="font-size:18px;"> <LinearLayout android:layout_width="match_parent" android:layout_height="fill_parent" android:orientation="vertical" > <FrameLayout android:layou

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

菜鸟瞎搞,高手莫进 本人菜鸟一枚,最近在学Android编程,网上看了一些视频教程,于是想着平时手机上的计算器应该很简单,自己何不尝试着做一个呢? 于是就冒冒失失的开撸了. 简单计算器嘛,功能当然很少,加减乘除就可以. 第一步:设计布局文件 界面如下图: 由于刚开始学Android,对布局文件也不是很了解,边查边找,最后凑合着写好了布局文件. 注意事项:此布局文件用到了GridLayout布局,是在Android4.0以上才出现的(不知道谷歌有没有开发相应的包来适配4.0以下版本). 有关Gri