ViewPager控件允许页面在水平方向左右滑动,就像翻书、翻报纸,Android提供了已经分装好的控件。对于ViewPager来说,一个页面就是一个项(相当于ListView的一个列表项),许多页面组成ViewPager的页面项。
ListView和GridView的适配器使用的是BaseAdapter。ViewPager的适配器使用的是PagerAdapter。
ListView和GridView的监听器使用的是OnItemClickListener。ViewPager的监听器使用的是OnPageChangeListener。
下面是ViewPager三个常用方法的说明:
(1) setAdapter() 设置页面项的适配器,适配器用的是PagerAdapter及其子类。
(2) setCurrentItem() 设置当前页码,即打开翻页视图时默认显示哪个页面。
(3) addOnPageChangeListener() 设置翻页视图的页面切换监听器。该监听器需实现接口OnPageChangeListener下的三个方法:
-1- onPageScrollStateChanged : 在页面滑动状态变化时触发。
-2- onPageScrolled : 在页面滑动过程中触发。
-3- onPageSelected : 在选中页面时,即滑动结束后触发。
1.ViewPager在XML中使用
<androidx.viewpager.widget.ViewPagerandroid:id="@+id/viewPager"android:layout_width=" ~ "android:layout_height=" ~ ">~有翻页标题就添加部分代码~</androidx.viewpager.widget.ViewPager>
2.每页的XML布局文件
例. res / layout / viewitem_layout.xml<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/white"><ImageViewandroid:id="@+id/imageView"android:layout_width="match_parent"android:layout_height="match_parent"android:scaleType="fitCenter"/></androidx.constraintlayout.widget.ConstraintLayout>
3.翻页适配器 PagerAdapter
例.class MyPagerAdapter extends PagerAdapter{private List<View> viewList;public MyPagerAdapter(List<View> viewList){this.viewList=viewList;//构造函数用于获取适配器资源//如在适配器内声明了资源,就不用写构造函数了}public int getCount() {return viewList.size();}public boolean isViewFromObject( View view, Object object ) {return view.equals(object);}public Object instantiateItem( ViewGroup container, int position ) {//向容器内添加指定页面;返回值也为该页面container.addView(viewList.get(position));return viewList.get(position);}public void destroyItem( ViewGroup container, int position, Object object ) {//从容器中移出指定页面container.removeViewInLayout(viewList.get(position));}
}
适配器必须重写4个方法: getCount() 、isViewFromObject() 、instantiateItem() 、destroyItem()
4.翻页监听器 OnPageChangeListener
class MyOnPageChangeListener implements ViewPager.OnPageChangeListener{public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {//在翻页过程中触发//第一个参数表示当前页面序号;第二个参数表示当前页面偏移量,取值在0到1之间;第三个参数表示当前页面的偏移距离}public void onPageSelected(int position) {//在翻页结束后触发//参数表示当前页面序号}public void onPageScrollStateChanged(int state) {//在翻页状态改变时触发//参数为翻页状态:0为静止 1为正在滑动 2为滑动完毕//滑动状态依次为:正在滑动(1) -> 滑动完毕(2) -> 静止(0)}}
5.翻页视图的使用及设置
ViewPager viewPager=findViewById(R.id.~);viewPager.setAdapter(new MyPagerAdapter( 参数 ));viewPager.setCurrentItem(0);//监听器可不加
viewPager.addOnPageChangeListener(new MyOnPageChangeListener());
6.翻页标题栏 PagerTitleStrip / PagerTabStrip
为了方便开发者处理ViewPager的页码显示与切换,Android附带了两个控件,分别是PagerTitleStrip和PagerTabStrip。两者都是在ViewPager页面上方展示设定的页面标题,不同之处在于PagerTitleStrip只是单纯的文本标题效果,无法点击进行页面切换;PagerTabStrip类似选项卡效果,文本下面有横线,点击左右选项卡即可切换到对应页面。
想在标题栏中显示指定文字,需重写PagerAdapter的getPageTitle()方法,在这方面两个控件的处理是一样的:
class MyPagerAdapter extends PagerAdapter{... ...//用于返回指定序号页面的标题public CharSequence getPageTitle(int position) {return ~ ;}}
翻页标题栏在XML文件中的使用如下:
<androidx.viewpager.widget.ViewPagerandroid:layout_width="match_parent"android:layout_height="match_parent"><androidx.viewpager.widget.PagerTitleStripandroid:id="@+id/pagerTitleStrip"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@color/purple_200"/></androidx.viewpager.widget.ViewPager>
翻页标题栏因只有文本,所以样式只能调整文本大小及颜色;但因无XML属性,所以只能在代码中调用文本样式的设置方法。
PagerTitleStrip pagerTitleStrip=findViewById(R.id.pagerTitleStrip);
pagerTitleStrip.setTextSize( TypedValue.COMPLEX_UNIT_SP , 20 );
pagerTitleStrip.setTextColor( R.color.white );