本文以一个简单的小例子,简述在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布局代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 28 13 1423 31 32 33 39
Java代码(图片轮播)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
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
Java代码(Fragment滑动)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
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 ListmList;21 LinearLayout llIndicator2;22 @Override23 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 ();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 position43 */44 @Override45 public void onPageSelected(int position) {46 //设置指示器47 llIndicator2.removeAllViews();48 setIndicator(position);49 }50 });51 }52 53 /**54 * 设置指示器55 * @param position56 */57 private void setIndicator(int position){58 for(int i=0;i
备注
ViewPager支持的Fragment也是android.support.v4.app包中的Fragment,需要调用的Activity也是需要继承android.support.v4.app.FragmentActivity 。ViewPager中的图片指示器是用LinearLayout中图片实现的。