前言
在实际的Android开发当中,ViewPager是我们经常使用的组件之一。比如我们常见的应用的引导页、Banner自定义控件中都有使用到ViewPager。
ViewPager
ViewPager简介和作用
ViewPager是Android扩展包v4包,这个类可以让用户切换当前的view。
1.ViewPager类直接继承了ViewGroup类,所以它是一个容器类,可以在其中添加其他View类。
2.ViewPager类需要一个PagerAdapter适配器类给它提供数据。
3.ViewPager经常和Fragment一起使用,并且提供了专门的FragmentPagerAdapter和FragmentStatePagerAdapter类供Fragment中的ViewPager使用。
ViewPager的使用
ViewPager的功能就是可以使视图滑动,就像Lancher左右滑动那样。分三个步骤来使用它:
- 在XML文件中加入;
- 加载要显示的页卡
- 在Activity里实例化ViewPager组件,并且设置Adapter(PagerAdapter,方法与ListView一样的),在这里一般需要重写PagerAdapter。)
XML文件中配置
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
监听事件
viewpager.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int arg0) {
//当页面选中时
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2){
//arg0 当前页
//arg1 移动页百分比
//arg2 移动像素点
}
@Override
public void onPageScrollStateChanged(int arg0) {
//滑动状态改变
}
};
ViewPager的适配器
简介中提到了PagerAdapter,和ListView等控件使用一样,需要ViewPager设置PagerAdapter来完成页面和数据的绑定,这个PagerAdapter是一个基类适配器,我们经常用它来实现App引导页,它的子类有FragmentPagerAdapter和FragmentStatePagerAdapter,这两个子类适配器用于和Fragment一起使用,在App中它们就像Listview一样出现的频繁。
实现一个最基本的PagerAdapter,必须实现下面的四个方法,在代码中有注释出来
import java.util.List;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
public class MyAdapter extends PagerAdapter{
private List<View> list;
public MyAdapter(List<View> list){
this.list = list;
}
@Override
public int getCount() {
//必须实现,返回要展示的图片数量
return list.size();
}
@Override
public boolean isViewFromObject(View view, Object object) {
//必须实现
return view == object;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
//必须实现,实例化
container.addView(list.get(position));
return list.get(position);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
//必须实现,销毁
container.removeView(list.get(position));
}
}
ViewPager结合Fragment显示
从前面几篇文章,我们知道,实现ViewPager是要有适配器的,我们前面用的适配器是PagerAdapter,而对于Fragment,它所使用的适配器是:FragmentPagerAdapter。FragmentPagerAdapter派生自PagerAdapter,它是用来呈现Fragment页面的,这些Fragment页面会一直保存在fragment manager中,以便用户可以随时取用。
在使用ViewPager时,必须使用v4包下的Fragment,并且使用FragmentActivity。
这个适配器最好用于有限个静态fragment页面的管理。尽管不可见的视图有时会被销毁,但用户所有访问过的fragment都会被保存在内存中。因此fragment实例会保存大量的各种状态,这就造成了很大的内存开销。所以如果要处理大量的页面切换,建议使用FragmentStatePagerAdapter.
对于FragmentPagerAdapter的派生类,只需要重写getItem(int)和getCount()就可以了。
public class FragAdapter extends FragmentPagerAdapter {
private List<Fragment> mFragments;
public FragAdapter(FragmentManager fm,List<Fragment> fragments) {
super(fm);
mFragments=fragments;
}
@Override
public Fragment getItem(int arg0) {
//根据传来的参数arg0,来返回当前要显示的Fragment
return mFragments.get(arg0);
}
@Override
public int getCount() {
//返回用于滑动的fragment总数
return mFragments.size();
}
}