Android ViewPager2实践

参考文章:
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相对来说,容易左右滑动。 交互效果不好

猜你喜欢

转载自blog.csdn.net/weixin_43662090/article/details/110006708