【前言】
之前的项目中使用过ViewPager,被坑过几次,如果你在RecyclerView中的Item使用ViewPager,你绝对会产生莫名其妙的问题,因为ViewPager在同一界面上不能有两个一样的ID,否则会导致滑动和内存问题,所以使用ViewPager嵌套在列表视图的Item里面,需要动态赋值ID或者动态生成ViewPager实例。
最近谷歌也是放出了正式版本的ViewPager2(也就是1.0.0稳定版本),现在你可以放心的将ViewPager2用于生产环境了:
dependencies { implementation "androidx.viewpager2:viewpager2:1.0.0" }
当然ViewPager2是androidx包的一个库,同时也就是 Jetpack 库的成员组件之一,具体参考下面的地址:
https://developer.android.google.cn/jetpack/androidx/releases/viewpager2
【最简单的使用】
ViewPager2是内部使用了RecyclerView,最简单用法就是设置一个Adapter即可马上使用,下面的ViewPager2默认是横向滚动:
ViewPager2 uiVisitorPager2 = mRootView.findViewById(R.id.uiVisitorPager2);
uiVisitorPager2.setAdapter(new RecyclerView.Adapter() {
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View item = View.inflate(parent.getContext(), R.layout.face_item_domicile, null);
ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
item.setLayoutParams(lp);
RecyclerView.ViewHolder vh = new RecyclerView.ViewHolder(item){}; return vh; } @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { } @Override public int getItemCount() { return 10; } });
注意到上面的手动设置LayoutParams,否则会抛出:
java.lang.IllegalStateException: Pages must fill the whole ViewPager2 (use match_parent)
【垂直滚动的特性】
ViewPager2支持横向和垂直滚动,只需要在xml中通过android:orientation指定方向:
<androidx.viewpager.widget.ViewPager android:id="@+id/uiVisitorPager" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="1dp" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@id/uiTopTitle">
【ViewPager2.PageTransformer】
ViewPager2同样支持与ViewPager已有的PageTransformer,而且使用方式完全一致,所以很方便的可以复用以前的PageTransformer。
ViewPager2.PageTransformer定义在ViewPager2的内部,是一个接口,接口的方法与ViewPager的PageTransformer一模一样。
public abstract void transformPage(View page, float position)