首先,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.ViewPager
android: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的列表,这四个方法基本上都不需要改动。
@Override
public int getCount() {
return images.size();
}
@Override
public boolean isViewFromObject(@NonNull @NotNull View view, @NonNull @NotNull Object object) {
return view==object;
}
@NonNull
@NotNull
@Override
public Object instantiateItem(@NonNull @NotNull ViewGroup container, int position) {
ImageView view = images.get(position);
container.addView(view);
return view;
}
@Override
public 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};
@Override
protected 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