这是我参与「第四届青训营 」笔记创作活动的的第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.