您的位置:首页 > 移动开发 > Android开发

ViewPager

2017-02-23 12:16 99 查看
ViewPager

     这是谷歌官方给我们提供的一个兼容低版本安卓设备的软件包,里面包囊了只有在安卓3.0以上可以使用的api。而viewpager就是其中之一利用它,我们可以做很多事情,从最简单的导航,到页面菜单等等。那如何使用它呢,与LisstView类似,我们也需要一个适配器,他就是PagerAdapter。ViewPager的功能就是可以使视图滑动,就像Lanucher左右滑动那样。

分三个步骤来使用它:

1.在布局文件里加入viewpage,注意是v4包下的,为了使低版本兼容

<android.support.v4.view.ViewPager

android:id="@+id/vp"

android:layout_width="match_parent"

android:layout_height="120dp">

</android.support.v4.view.ViewPager>

其中 <Android.support.v4.view.ViewPager /> 是ViewPager对应的组件,要将其放到想要滑动的位置

2.在Activity中加载要显示的ViewPager里面的内容(viewPager的内容初始化)
/**

* 改变点和图片描述文字的信息

*/

public void changeDotAndDesc(int position) {

position = position % ll.getChildCount();

tv_desc.setText(descs[position]);

for (int i=0; i<ll.getChildCount(); i++){

View child = ll.getChildAt(i);

child.setSelected(i==position);

}

}


 /**

* 初始化viewPage下面的点

*/

public void initDot() {

for (int i=0; i<imageResIds.length; i++) {

View view = new View(this);

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(dp2px(5), dp2px(5));

params.leftMargin = dp2px(5);

view.setBackgroundResource(R.drawable.selector_dot);

view.setLayoutParams(params);

ll.addView(view);

}

}


3.在Activity里实例化ViewPager组件,并设置它的Adapter(就是PagerAdapter,方法与ListView一样的),在这里一般需要重写PagerAdapter里面4个方法:getCount()、isViewFromObject(View view, Object object)、instantiateItem(ViewGroup container, int position)、destroyItem(ViewGroup container, int position, Object object)
package com.heima.adbanner;


import android.support.v4.view.PagerAdapter;

import android.view.View;

import android.view.ViewGroup;

import android.widget.ImageView;


/**

* Created by fuwei on 2016-10-17 上午 10:37.

* viewPage适配器

*/

public class BannerAdapter extends PagerAdapter{

private int[] imageIds;


public BannerAdapter(int[] imageIds) {

this.imageIds = imageIds;

}


 /**

* viewPage条目的数目

* @return

*/

@Override

public int getCount() {

return imageIds.length * 1000 * 100; //无限循环

}

 /**

* viewPage是否被复用,固定写法

*/

@Override

public boolean isViewFromObject(View view, Object object) {

return view == object;

}


 /**

* 创建一个条目

* @param container  包含条目的容器

* @param position

* @return

*/

@Override

public Object instantiateItem(ViewGroup container, int position) {

ImageView imageView = new ImageView(container.getContext());

position = position % imageIds.length;

imageView.setImageResource(imageIds[position]);

container.addView(imageView);

return imageView;

}


 /**

* 销毁一个条目

* @param container

* @param position

* @param object  创建一个条目时候返回的对象

*/

@Override

public void destroyItem(ViewGroup container, int position, Object object) {

container.removeView((View) object);

}

}

PageAdapter 必须重写的四个函数:1、boolean isViewFromObject(View arg0, Object arg1): 返回值:如果对应的是同一个View,返回True,否则返回False。2、int getCount():返回要滑动的VIew的个数3、void destroyItem(ViewGroup container, int position,Object object):从当前container中删除指定位置(position)的View;4、Object instantiateItem(ViewGroup container, int position):做了两件事,第一:将当前视图添加到container中,第二:返回当前View 返回值:返回一个代表新增视图页面的Object(Key),这里没必要非要返回视图本身,也可以这个页面的其它容器。其实我的理解是可以代表当前页面的任意值,只要你可以与你增加的View一一对应即可,比如position变量也可以做为Key 功能:该函数用来判断instantiateItem(ViewGroup, int)函数所返回来的Key与一个页面视图是否是代表的同一个视图(即它俩是否是对应的,对应的表示同一个View) 这个函数的实现的功能是创建指定位置的页面视图。适配器有责任增加即将创建的View视图到这里给定的container中,这是为了确保在finishUpdate(viewGroup)返回时this is be done!
PagerTabStrip和PagerTitleStrip与ViewPager的结合使用 我们讲解了滑动页面的的实现方法与四大函数的意义,但有时,仅仅实现页面滑动是不够的,还要有标题栏才会显得更友好。所以在这篇文章中,我将会向大家展示在Android.support.v4包中的两个控件PagerTabStrip与PagerTitleStrip,他们都是用来实现标题栏的,但各自有些不同。
一、PagerTabStrip    PagerTabStrip是ViewPager的一个关于当前页面、上一个页面和下一个页面的一个非交互的指示器。它经常作为ViewPager控件的一个子控件被被添加在XML布局文件中。在你的布局文件中,将它作为子控件添加在ViewPager中。而且要将它的 android:layout_gravity 属性设置为TOP或BOTTOM来将它显示在ViewPager的顶部或底部。每个页面的标题是通过适配器的getPageTitle(int)函数提供给ViewPager的。
1、首先,文中提到:在你的布局文件中,将它作为子控件添加在ViewPager中。2、第二,标题的获取,是重写适配器的getPageTitle(int)函数来获取的。
二、PagerTitleStrip    PagerTabStrip是ViewPager的一个关于当前页面、上一个页面和下一个页面的一个可交互的指示器。它经常作为ViewPager控件的一个子控件被被添加在XML布局文件中。在你的布局文件中,将它作为子控件添加在ViewPager中。而且要将它的 android:layout_gravity 属性设置为TOP或BOTTOM来将它显示在ViewPager的顶部或底部。每个页面的标题是通过适配器的getPageTitle(int)函数提供给ViewPager的。    可以看到,除了第一句以外的其它句与PagerTitleStrip的解释完全相同。即用法也是相同的。只是PagerTabStrip是可交互的,而PagerTitleStrip是不可交互的区别。对于区别在哪些位置,即是上面的两点(是否可点击与下划线指示条)。用法与PagerTitleStrip完全相同,即:1、首先,文中提到:在你的布局文件中,将它作为子控件添加在ViewPager中。2、第二,标题的获取,是重写适配器的getPageTitle(int)函数来获取的。

使用Fragment实现ViewPager滑动
   前几篇文章讲解了ViewPager的普通实现方法,但Android官方最推荐的一种实现方法却是使用fragment。
   我们知道,实现ViewPager是要有适配器的,我们前面用的适配器是PagerAdapter,而对于fragment,它所使用的适配器是:FragmentPagerAdapter。FragmentPagerAdapter派生自PagerAdapter,它是用来呈现Fragment页面的,这些Fragment页面会一直保存在fragment manager中,以便用户可以随时取用。这个适配器最好用于有限个静态fragment页面的管理。尽管不可见的视图有时会被销毁,但用户所有访问过的fragment都会被保存在内存中。因此fragment实例会保存大量的各种状态,这就造成了很大的内存开销。所以如果要处理大量的页面切换,建议使用FragmentStatePagerAdapter.每一个使用FragmentPagerAdapter的ViewPager都要有一个有效的ID集合,有效ID的集合就是Fragment的集合对于FragmentPagerAdapter的派生类,只需要重写getItem(int)和getCount()就可以了。
   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  viewpager android