一起学Android之ViewPager

千磨万击还坚劲,任尔东西南北风。这篇文章主要讲述一起学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构造函数中的一个参数。
示例截图图片轮播如下所示:
一起学Android之ViewPager

文章图片

示例源码xml布局代码
一起学Android之ViewPager

文章图片
一起学Android之ViewPager

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

View Code【一起学Android之ViewPager】java代码(图片轮播)
一起学Android之ViewPager

文章图片
一起学Android之ViewPager

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

View CodeJava代码(Fragment滑动)
一起学Android之ViewPager

文章图片
一起学Android之ViewPager

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

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

    推荐阅读