玩转ViewPager2

玩转ViewPager2

Android小彩虹2021-08-26 23:56:09140A+A-

ViewPager2 是什么?

ViewPager2是Androidx里最新添加的一个元素。它可以用来实现下面这种效果:

也就是可以有多个Fragment(或者是View也可以),然后通过滑动在它们之间移动。

这种操作可以用在很多地方。比如掘金官方app里,就可以通过左右滑动来进入不同的板块,“前端”,“后端”,“Android”等。还有就是很多app在第一次启动的时候,会有一些介绍页。用户可以通过滑动进入下一个介绍页。

ViewPager2怎么用

ViewPager2的基本用法非常简单。总得来说分两步:

  1. 在你的layout里添加ViewPager
  2. 为你的ViewPager添加一个adapter。

首先添加dependdency:

dependencies {
	implementation "androidx.viewpager2:viewpager2:1.0.0"
}

然后在layout里添加ViewPager

<androidx.viewpager2.widget.ViewPager2 android:id="@+id/view_pager" android:layout_width="match_parent" android:layout_height="0dp" app:layout_constraintTop_toBottomOf="@id/tab_layout" app:layout_constraintBottom_toBottomOf="parent" />

最后为ViewPager添加adapter:

val viewPager = ...
viewPager.adapter = ViewPagerAdapter()

至于这个adapter怎么实现,取决于你是想要在Fragment之间滑动,还是在View之间滑动。

如果是在Fragment之间滑动,则构建一个FragmentStateAdapter的子类:

private class ViewPagerAdapter(activity: FragmentActivity) : FragmentStateAdapter(activity) {
   // Assuming there are three Fragmentss
 override fun getItemCount(): Int = 3

 override fun createFragment(position: Int): Fragment {
   return when(position) {
     0 -> FragmentOne()
     1 -> FragmentTwo()
     3 -> FragmentThree()
     else -> HomeFragment()
   }
 }
}

如果是在View之间滑动,那么就搞一个一般的RecyclerView.Adapter:

int[] layouts = new int[]{
  R.layout.slide_one,
  R.layout.slide_two,
  R.layout.slide_three,
  R.layout.slide_four};


public class ViewsSliderAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

  public ViewsSliderAdapter() {}

  @NonNull
  @Override
  public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext())
      .inflate(viewType, parent, false);
    return new SliderViewHolder(view);
  }

  @Override
  public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {

  }

  @Override
  public int getItemViewType(int position) {
    return layouts[position];
  }

  @Override
  public int getItemCount() {
    return layouts.length;
  }

  public class SliderViewHolder extends RecyclerView.ViewHolder {
    public TextView title, year, genre;

    public SliderViewHolder(View view) {
      super(view);
    }
  }
}

可见,ViewPager2其实就是包了一个RecyclerView

ViewPager2和TabLayout的结合

在最开始的那个例子里,不但可以在不同的Fragment之间滑动,上面的tabs也跟着变化。想要实现这个,需要使用TabLayout

首先,加入Material depenedency:

dependencies {
	implementation 'com.google.android.material:material:1.3.0-alpha04'
}

然后,在layout里添加TabLayout。可以放在ViewPager上面:

<com.google.android.material.tabs.TabLayout android:id="@+id/tab_layout" android:layout_width="match_parent" android:layout_height="wrap_content" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toTopOf="@id/view_pager" />

<androidx.viewpager2.widget.ViewPager2 android:id="@+id/view_pager" android:layout_width="match_parent" android:layout_height="0dp" app:layout_constraintTop_toBottomOf="@id/tab_layout" app:layout_constraintBottom_toBottomOf="parent" />

最后,在代码里加上:

private val titles = arrayOf("Tab0", "Tab1", "Tab2")

TabLayoutMediator(binding.tabLayout, binding.viewPager) {
  tab: TabLayout.Tab, position: Int ->
  tab.text = titles[position]
}.attach()

搞定了。

转场动画

ViewPager2支持自定义滑动动画。方法就是自建一个ViewPager2.Transformer的子类。这里有很多例子。并不是非常复杂,有兴趣的可以自己研究一下。

Reference

这个repo包含不少不错的例子,可以自己clone下来跑跑看。 github.com/ravi8x/View…

点击这里复制本文地址 以上内容由权冠洲的博客整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!

支持Ctrl+Enter提交

联系我们| 本站介绍| 留言建议 | 交换友链 | 域名展示
本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除

权冠洲的博客 © All Rights Reserved.  Copyright quanguanzhou.top All Rights Reserved
苏公网安备 32030302000848号   苏ICP备20033101号-1
本网站由 提供CDN/云存储服务

联系我们