ViewPager

ViewPager

     这是谷歌官方给我们提供的一个兼容低版本安卓设备的软件包,里面包囊了只有在安卓3.0以上可以使用的api。而viewpager就是其中之一利用它,我们可以做很多事情,从最简单的导航,到页面菜单等等。那如何使用它呢,与LisstView类似,我们也需要一个适配器,他就是PagerAdapter。 ViewPager的功能就是可以使视图滑动,就像Lanucher左右滑动那样。
分三个步骤来使用它:
1.在布局文件里加入viewpage,注意是v4包下的,为了使低版本兼容
 
    
 
     
  1. <android.support.v4.view.ViewPager
  2. android:id="@+id/vp"
  3. android:layout_width="match_parent"
  4. android:layout_height="120dp">
  5. android.support.v4.view.ViewPager>
其中  是ViewPager对应的组件,要将其放到想要滑动的位置

2.在Activity中加载要显示的ViewPager里面的内容(viewPager的内容初始化)
 
      
  1. /**
  2. * 改变点和图片描述文字的信息
  3. */
  4. public void changeDotAndDesc(int position) {
  5. position = position % ll.getChildCount();
  6. tv_desc.setText(descs[position]);
  7. for (int i=0; i<ll.getChildCount(); i++){
  8. View child = ll.getChildAt(i);
  9. child.setSelected(i==position);
  10. }
  11. }
  12. /**
  13. * 初始化viewPage下面的点
  14. */
  15. public void initDot() {
  16. for (int i=0; i<imageResIds.length; i++) {
  17. View view = new View(this);
  18. LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(dp2px(5), dp2px(5));
  19. params.leftMargin = dp2px(5);
  20. view.setBackgroundResource(R.drawable.selector_dot);
  21. view.setLayoutParams(params);
  22. ll.addView(view);
  23. }
  24. }

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)
 
      
  1. package com.heima.adbanner;
  2. import android.support.v4.view.PagerAdapter;
  3. import android.view.View;
  4. import android.view.ViewGroup;
  5. import android.widget.ImageView;
  6. /**
  7. * Created by fuwei on 2016-10-17 上午 10:37.
  8. * viewPage适配器
  9. */
  10. public class BannerAdapter extends PagerAdapter{
  11. private int[] imageIds;
  12. public BannerAdapter(int[] imageIds) {
  13. this.imageIds = imageIds;
  14. }
  15. /**
  16. * viewPage条目的数目
  17. * @return
  18. */
  19. @Override
  20. public int getCount() {
  21. return imageIds.length * 1000 * 100; //无限循环
  22. }
  23. /**
  24. * viewPage是否被复用,固定写法
  25. */
  26. @Override
  27. public boolean isViewFromObject(View view, Object object) {
  28. return view == object;
  29. }
  30. /**
  31. * 创建一个条目
  32. * @param container 包含条目的容器
  33. * @param position
  34. * @return
  35. */
  36. @Override
  37. public Object instantiateItem(ViewGroup container, int position) {
  38. ImageView imageView = new ImageView(container.getContext());
  39. position = position % imageIds.length;
  40. imageView.setImageResource(imageIds[position]);
  41. container.addView(imageView);
  42. return imageView;
  43. }
  44. /**
  45. * 销毁一个条目
  46. * @param container
  47. * @param position
  48. * @param object 创建一个条目时候返回的对象
  49. */
  50. @Override
  51. public void destroyItem(ViewGroup container, int position, Object object) {
  52. container.removeView((View) object);
  53. }
  54. }
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,Android)