ViewPager
2017-02-23 12:16
99 查看
ViewPager
这是谷歌官方给我们提供的一个兼容低版本安卓设备的软件包,里面包囊了只有在安卓3.0以上可以使用的api。而viewpager就是其中之一利用它,我们可以做很多事情,从最简单的导航,到页面菜单等等。那如何使用它呢,与LisstView类似,我们也需要一个适配器,他就是PagerAdapter。ViewPager的功能就是可以使视图滑动,就像Lanucher左右滑动那样。
分三个步骤来使用它:
1.在布局文件里加入viewpage,注意是v4包下的,为了使低版本兼容
其中 <Android.support.v4.view.ViewPager /> 是ViewPager对应的组件,要将其放到想要滑动的位置
2.在Activity中加载要显示的ViewPager里面的内容(viewPager的内容初始化)
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)
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()就可以了。
这是谷歌官方给我们提供的一个兼容低版本安卓设备的软件包,里面包囊了只有在安卓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()就可以了。
相关文章推荐
- Android 左右滑屏 方向判断 ViewPager
- [控件]ViewPager
- android-Viewpager
- ViewPager
- 滚动广告——viewpager
- ViewPager使用详解
- viewpager使用详解
- ViewPager中的滑动监听器OnPageChangeListener
- ViewPagerInFragment 在Fragment中使用ViewPager
- android-custom-tab-with-viewpager
- ViewPager的使用,PagerAdapter的自定义改写
- ViewPager 详解
- 使用Fragment填充ViewPager
- ViewPager实现自动切换图片(一)
- ViewPager切换滑动速度
- ViewPager渲染背景颜色渐变(引导页)--第三方开源--ColorAnimationView
- ViewPager 调用notifyDataSetChanged()不刷新内容的问题
- viewpager加圆点应用
- ViewPager系列之ViewPager一屏显示多个子页面
- ViewPager无限轮播与小点点