今天我们来看看ViewPager,这个控件非常实用。闲话不说,直接进入主题:

要构造ViewPager,先说几点要注意一点,ViewPager 是存在于Android的 v4 兼容包里:

android.jar 就是我们的最主要的sdk, android.support.v4.jar 就是android为了高版本sdk兼容低版本系统而创建的兼容包。 ViewPager就是一个控件,和TextView一个级别,其初始方法要使用到Adapter,我们自然联想到了ListView。那么它与ListView最大的不同就是其初始化时可以使用3中Adapter:

(1)PagerAdapter :用于初始化view,

(2)FragmentPagerAdapter:用于初始化 Fragment,

(3)FragmentStatePagerAdapter:和FragmentPagerAdapter类似,但是提供更加全面的创建和销毁功能。

接下来我们来一一介绍,先贴一张效果图:


1. 要使用ViewPager,首先需要在布局中引入控件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="vertical" >    <android.support.v4.view.ViewPager        android:id="@+id/viewpager"        android:layout_width="match_parent"        android:layout_height="match_parent" >        <android.support.v4.view.PagerTabStrip            android:id="@+id/pagertabstrip"            android:layout_width="match_parent"            android:layout_height="wrap_content" >        </android.support.v4.view.PagerTabStrip>    </android.support.v4.view.ViewPager></LinearLayout>
ViewPager就是我们的控件, PagerTabStrip是title。

2. 引入控件之后, 和listview一样, 我们就需要对其添加数据. 刚刚已经介绍过, 添加数据一共有3中Adapter,先来介绍最简单的一种PagerAdapter。

我们需要继承PagerAdapter,然后重写里面的方法:

package com.xiaoming.demo01_viewpager;import java.util.List;import android.support.v4.view.PagerAdapter;import android.util.Log;import android.view.View;import android.view.ViewGroup;public class MyPagerAdapter extends PagerAdapter {private static final String TAG = "MyPagerAdapter";private List<View> mViewList;private List<String> mTitleList;public MyPagerAdapter(List<View> viewlist, List<String> titlelist) {this.mViewList = viewlist;this.mTitleList = titlelist;}@Overridepublic int getCount() {return mViewList.size();}@Overridepublic boolean isViewFromObject(View view, Object obj) {return view==obj;}@Overridepublic Object instantiateItem(ViewGroup container, int position) {container.addView(mViewList.get(position));Log.d(TAG,"instantiateItem,"+"position:"+position);return mViewList.get(position);}@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {container.removeView(mViewList.get(position));Log.d(TAG,"destroyItem,"+"position:"+position);}@Overridepublic CharSequence getPageTitle(int position) {return mTitleList.get(position);}}
mViewList 是传入要显示的View列表,在MainActivity中的初始化为:

mTitleList 是传入对应每页要显示的title,在MainActivity中的初始化为:

这里需要重写的几个方法也很简单:

(1)getCount() : 获取总共页数

(2)isViewFromObject(View view, Object obj):判断view是否是指定的obj,直接参照官方api:return view==obj;

(3)instantiateItem(ViewGroup container, int position):用来初始化容器中的内容:

先是添加到容器中:container.addView(mViewList.get(position));

然后返回显示的view:return mViewList.get(position);

(4)destroyItem(ViewGroup container, int position, Object object):移除对象,并且销毁不要的对象:

   container.removeView(mViewList.get(position));

(5)getPageTitle(int position): 得到对应页的标题: return mTitleList.get(position);

5个方法都很简单,重写完之后我们就可以来加载ViewPager了:

mViewPager = (ViewPager) findViewById(R.id.viewpager);MyPagerAdapter myadapter = new MyPagerAdapter(viewlist, titlelist);mViewPager.setAdapter(myadapter);

这样就完成了。如果想监听viewpager变化时的时间,可以给MainActivity实现 OnPageChangeListener, 然后重写这三个方法,我们这里用最简单的toast来提示:

@Overridepublic void onPageScrollStateChanged(int arg0) {}@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {}@Overridepublic void onPageSelected(int arg0) {showToast("当前是第" + arg0 + "页");}


3. 介绍完了使用PagerAdapter,我们来介绍使用Fragment填充ViewPager内容:

和使用view一样,首先需要初始化一个Fragment列表(至于fragment不在这里介绍):


然后写一个adapter继承至 FragmentPagerAdapter:

package com.xiaoming.demo01_viewpager;import java.util.List;import android.support.v4.app.Fragment;import android.support.v4.app.FragmentManager;import android.support.v4.app.FragmentPagerAdapter;public class MyFragmentPageAdapter extends FragmentPagerAdapter {private List<Fragment> mListFragment;private List<String> mListTitle;public MyFragmentPageAdapter(FragmentManager fm,List<Fragment> listFragment, List<String> listTitle) {super(fm);this.mListFragment = listFragment;this.mListTitle = listTitle;}@Overridepublic Fragment getItem(int position) {return mListFragment.get(position);}@Overridepublic int getCount() {return mListFragment.size();}@Overridepublic CharSequence getPageTitle(int position) {return mListTitle.get(position);}}
实现的方法主要少了两个:instantiateItem() 和 destroyItem() ,因为在使用fragment和ViewPager结合的时候,第一次加载ViewPager,就会把所有的fragment都加载进入,而且知道ViewPager销毁时才会销毁fragment列表中的fragment。 但是在使用 pageradapter的时候,一次系统加载3个view中内存中,会动态的创建和删除大于3个的部分。相面代码中也有log,大家可以参考看一下。

在MainActivity中使用:

        MyFragmentPageAdapter fadapter = new MyFragmentPageAdapter(getSupportFragmentManager(), fragmentlist, titlelist);        mViewPager.setAdapter(fadapter);

这里需要注意,初始化 FragmentPageAdapter第一个参数是 FragmentManager,用来管理Fragmnet。获得FragmentManager有两种情况:

(1)如果使用 import android.support.v4.app.Fragment; 就是v4包中的Fragment,需要使用Activity 的 getSupportFragmentManager() 获得FragmentManager。

(2)如果使用 import android.app.Fragment; 就是正牌Fragmnet,兼容性没有那么好,直接使用Activity 的 getFragmentManager() 得到FragmentManager。


4. 使用 FragmentStatePagerAdapter 填充 :

package com.xiaoming.demo01_viewpager;import java.util.List;import android.support.v4.app.Fragment;import android.support.v4.app.FragmentManager;import android.support.v4.app.FragmentStatePagerAdapter;import android.view.ViewGroup;public class MyFragmentStatePageAdapter extends FragmentStatePagerAdapter {private List<Fragment> mListFragment;private List<String> mListTitle;public MyFragmentStatePageAdapter(FragmentManager fm,List<Fragment> listFragment, List<String> listTitle) {super(fm);this.mListFragment = listFragment;this.mListTitle = listTitle;}@Overridepublic Fragment getItem(int position) {return mListFragment.get(position);}@Overridepublic int getCount() {return mListFragment.size();}@Overridepublic CharSequence getPageTitle(int position) {return mListTitle.get(position);}@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {super.destroyItem(container, position, object);}@Overridepublic Object instantiateItem(ViewGroup arg0, int arg1) {return super.instantiateItem(arg0, arg1);}}
使用方法和使用FragmentPagerAdapter完全一样,就是多重写了两个方法,而且都是使用的父类的实现:

@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {super.destroyItem(container, position, object);}@Overridepublic Object instantiateItem(ViewGroup arg0, int arg1) {return super.instantiateItem(arg0, arg1);}
所以FragmentStatePagerAdapter 比 FragmentPagerAdapter 多的功能就是可以动态的管理显示和销毁fragment。


总结一下:

填充ViewPager的内容一共有3中方式:

(1)使用PagerAdapter,最简单,方便,和view结合。可以动态创建和销毁ViewPager中页的内容。

(2)使用FragmentPagerAdapter,使用fragmnet作为Viewpager内容,fragment的生命周期更加可控,所以更推荐。但是不能动态创建和销毁ViewPager中页的内容。但是这也不见得不是好事哦!

(3)FragmentStatePagerAdapter 像是PagerAdapter和FragmentPagerAdapter的结合,及使用fragment,又可以实现动态加载内容。


好了,结束!!


下面可贴上代码:

http://download.csdn.net/detail/u013647382/8329741

更多相关文章

  1. EventBus 和RxLifecycle 一起使用所引发的问题及解决办法 -java.
  2. Android(安卓)利用addView 动态给Activity添加View组件
  3. android Content provider 组件
  4. 第一行代码读书笔记 Kotlin Android
  5. [Android][Android(安卓)Studio] *.jar 与 *.aar 的生成与*.aar
  6. Android面试题笔记(一)
  7. Android(安卓)proguard混淆编译的问题
  8. Android(安卓)Display架构分析--侧重高通平台
  9. Android(安卓)画图之抗锯齿

随机推荐

  1. Android 5.1 SystemUI-状态栏
  2. android 沉浸式状态栏的三种方法
  3. Android手机拍照和手机相册选取图片的工
  4. 关于android 布局中诡异的AttributeSet
  5. Android通知Notification
  6. 【Android】定义HttpPost连接超时
  7. Android向桌面添加快捷方式,使其指向特定
  8. android联系人过滤
  9. android 自定义组件随着手指自动画圆
  10. android MediaRecorder录音