PagerView2实践笔记 | 青训营笔记

194 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的的第7天。

ViewPager2是 ViewPager库的改进版本,在其内部是继承自RecyclerView的
它比其前任ViewPager的性能高了很多,也有许多的优化。
既然ViewPager2是基于RecyclerView的,那么其用法与RecyclerView其实差不多
甚至可以把它视为一个屏幕只有一个item的RecyclerView。

简单使用

首先再xml里声明一下布局

    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/follow_n_follower_viewer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintVertical_bias="0.0"/>

既然上文提到了其继承自RecyclerView,我们可以简单的套用RecyclerView。Adapter来实现。
这在我之前的文章里说过了,我把大致的代码贴在下面。

class MyViewPagerAdapter() : RecyclerView.Adapter<MyViewPagerAdapter.ViewHolder>(){
    inner class ViewHolder(view:View) : RecyclerView.ViewHolder(view){
        //TODO
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        //TODO
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        //TODO
        }
    }

    override fun getItemCount(): Int {
        //TODO
    }
}

当然,也可以往ViewPager里填充Fragment,这时候Adapter就得换成FragmentStateAdapter了
代码如下

class MyAdapter(activity: AppCompatActivity, val itemsCount: Int) :
    FragmentStateAdapter(activity) {

  override fun getItemCount(): Int {
    //TODO
  }

  override fun createFragment(position: Int): Fragment {
    //TODO
  }
}

需要做的就是在createFragment里创建一个Fragment的实例,在getItemCount里返回数量,其实非常简单。

当然ViewPager2也支持纵向的滑动,只需要一行代码

MyViewPager.orientation = ViewPager2.ORIENTATION_VERTICAL

ViewPager2也可以配合TabLauOut来使用,但是需要借助TabLayoutMediator当作桥梁,需要实现一个匿名方法,用法如下。

TabLayoutMediator(tabLayout, MyViewer) { tab, position ->
  //TODO
}.attach()

这里的attach很重要。
设置好之后,tab栏就能跟着ViewPager2一起转动了。
ViewPager2使用FragmentStateAdapter时,会自动设置设置离屏缓存数量,当limit<1时,不会进行预加载,即不会回调Fragment相应的生命周期;反之会进行预加载,并回调预加载Fragment相应的生命周期,limit的默认值OFFSCREEN_PAGE_LIMIT_DEFAULT为-1,即默认就是懒加载;这一点跟VP不同,VP中默认值为1,即默认就会加载左右两侧的Fragment。
在日常开发中,尽量使用优化更好的ViewPager2,避免使用ViewPager1.