首先,ViewPager已经被淘汰了,目前应该使用ViewPager2。我之所以看这个是有某种原因。
事由:
在网上看到很多关于ViewPager的文章,但是大多数都结合了一些其他的东西,比如shape、Selector,让我这种小白看得云里雾里。真的叫难者不会、会者不难。所以在勉强看懂后,精简了一下。
ViewPager是安卓的一个组件,允许用户左右滑动显示放置在里面的多个View。
PagerAdapter用于向ViewPager中放入多个View。
用法:
一、构建布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><androidx.viewpager.widget.ViewPagerandroid:id="@+id/imagePager"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal" /></LinearLayout>
二、自定义一个Adapter类继承自PagerAdapter
一般来说,我们需要为自定义的Adapter类准备一个构造函数,用于保存传入的参数,并且生成需要左右滑动的多个View。
1、需要从活动传入上下文
2、需要传入每个滑动页面的背景图(也可以传入包含背景图的自定义类)
为了简单,我们只传入了背景图的id,因为ImageView也是View的一种,所以就直接在ViewPager中构建了一个List<ImageView>来存放需要滑动的View。
大多数情况下,你需要为滑动页面写一个布局文件,不仅包括背景图,还包括一些按钮什么的。
public class MyPagerAdapter extends PagerAdapter {private Context myContext;private int[] imageArray;private List<ImageView> images;public MyPagerAdapter(Context myContext, int[] imageArray) {this.myContext = myContext;this.imageArray = imageArray;images = new ArrayList<>();for (int id : imageArray) {ImageView view = new ImageView(myContext);// 设置图片填满整个容器view.setScaleType(ImageView.ScaleType.FIT_XY);view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT));view.setImageResource(id);images.add(view);}}
三、重写父类方法
至少需要重写四个父类方法。
1、getCount():返回可滑动的View总数
2、isViewFromObject:判断instantiateItem()函数所返回来的Key与一个页面视图是否同一个视图
3、instantiateItem():装填当前位置的View
4、destroyItem():去除当前位置的View
只要一开始初始化好了View的列表,这四个方法基本上都不需要改动。
@Overridepublic int getCount() {return images.size();}@Overridepublic boolean isViewFromObject(@NonNull @NotNull View view, @NonNull @NotNull Object object) {return view==object;}@NonNull@NotNull@Overridepublic Object instantiateItem(@NonNull @NotNull ViewGroup container, int position) {ImageView view = images.get(position);container.addView(view);return view;}@Overridepublic void destroyItem(@NonNull @NotNull ViewGroup container, int position, @NonNull @NotNull Object object) {container.removeView(images.get(position));}
}
四、关联Adapter
简单的通过setAdaper()方法,将ViewPager和自定义的PagerAdapter关联起来。
public class MainActivity extends AppCompatActivity {// 定义引导页图片数组private int[] imageArray = {R.drawable.yingdao1, R.drawable.yingdao2,R.drawable.yingdao3, R.drawable.yingdao4};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ViewPager viewPager = findViewById(R.id.imagePager);MyPagerAdapter adapter = new MyPagerAdapter(this, imageArray);viewPager.setAdapter(adapter);}
}
五、还需要做什么
做完上面的部分,就已经可以滑动了。不过很多时候还需要为ViewPager增加一个addOnPageChangeListener()方法,然后重写以下方法,来提供更多的功能:
1、onPageScrolled
2、onPageSelected
3、onPageScrollStateChanged