参考文章:
https://developer.android.com/training/animation/vp2-migration?hl=zh-cn
Android官方推出了ViewPager2来替代ViewPager. 目前从实践结果来看, 两者并没有什么太大的区别, 不过还是整理总结下
迁移
第一步当然是换名字了
将ViewPager换成ViewPager2.
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/transparent"
android:clipToPadding="false"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
第二步用来重写Adapter
原来的Adapter不能用了, 我们用FragmentStateAdapter来替代FragmentStatePageAdapter, 注意这两个名字是不一样的.
private inner class TabsAdapter(fm: FragmentManager) : FragmentStateAdapter(fm, lifecycle) {
override fun getItemCount(): Int {
return 2
}
override fun createFragment(position: Int): Fragment {
....
}
}
目前来看, 只是构造函数有区别, 函数名有区别, 其他几乎没有区别
第三步用来重写一些方法
ViewPager2中一些方法名发生了变化, 如addPageChangeListener替换成了registerOnPageChangeCallback等, 大部分都能直接找到方法名. 不赘述
区别
还是要说一些区别的.
- ViewPager2 支持局部刷新, 而ViewPager只支持notifyDataSetChange
notifyDataSetChanged();
notifyItemChanged(int position)
- ViewPager2实现了懒加载和View的复用
懒加载不必说了, viewpager实际上也可以实现
ViewPager2的Adapter实际上是RecycleView的Adapter.
我们从setAdaper的方法中就能看到
/**
* @param adapter The adapter to use, or {@code null} to remove the current adapter
* @see androidx.viewpager2.adapter.FragmentStateAdapter
* @see RecyclerView#setAdapter(Adapter)
*/
public void setAdapter(@Nullable @SuppressWarnings("rawtypes") Adapter adapter) {
final Adapter<?> currentAdapter = mRecyclerView.getAdapter();
mAccessibilityProvider.onDetachAdapter(currentAdapter);
unregisterCurrentItemDataSetTracker(currentAdapter);
mRecyclerView.setAdapter(adapter);
mCurrentItem = 0;
restorePendingState();
mAccessibilityProvider.onAttachAdapter(adapter);
registerCurrentItemDataSetTracker(adapter);
}
所以他必然实现了ViewHolder的复用机制. 这应该是最大的一个区别.
其他暂时没有发现
缺点
使用了ViewPager2下,觉得ViewPager2相对来说,容易左右滑动。 交互效果不好