ViewPage2是ViewPage的取代者,解决了一些解决了其前辈ViewPage的大部分难题,包括从右到左的布局支持,垂直方向,可修改的Fragment集合等(这段是注解里复制的)。从易用性上来说ViewPage2的确会比ViewPage更简单,并且它实际上是使用RecyclerView实现的。源码里可以很容易看到,另外它的适配器也是RecyclerView.Adapter。

 参考 https://blog.csdn.net/sinat_35241409/article/details/107536514

 

https://www.jianshu.com/p/f5d18cc2f6ad

依赖

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

xml属性

xml写法

        <androidx.viewpager2.widget.ViewPager2
            android:
            android:layout_width="match_parent"
            android:layout_height="180dp" />

设置滚动方向的属性

android:orientation="horizontal"

使用FragmentStateAdapter

class MessageAdapter(fragments: List<Fragment>, fragment: Fragment) : FragmentStateAdapter(fragment) {
    private var mFragments :List<Fragment> = fragments

    override fun getItemCount() = mFragments.size

    override fun createFragment(position: Int) = mFragments[position]
}

上面的代码是在Fragment中使用,如果需要在activity中使用就使用另一个构造方法

public FragmentStateAdapter(@NonNull FragmentActivity fragmentActivity)

然后是添加到ViewPager2里

        val fragmentList = listOf(AlertFragment.newInstance(), FamilyFragment.newInstance(), NoticeFragment.newInstance())
        val adapter = MessageAdapter(fragmentList, this)
        mBinding.viewPager.adapter = adapter

禁用左右滑动切换

viewPager.setUserInputEnabled(false)

与TabLayout配合使用

TabLayout tabLayout = view.findViewById(R.id.tab_layout);
        new TabLayoutMediator(tabLayout, viewPager,
                (tab, position) -> tab.setText("OBJECT " + (position + 1))
        ).attach();

 但是请注意!在添加数据的时候不需要在newTab了,参考如下代码

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        val fragmentList = listOf(AlertFragment.newInstance(), FamilyFragment.newInstance(), NoticeFragment.newInstance())
        val adapter = MessageAdapter(fragmentList, this)
        mBinding.viewPager.adapter = adapter
        val tabIconArray = intArrayOf(R.drawable.message_ic_alert_3, R.drawable.message_ic_family_3, R.drawable.message_ic_notice_3)
        TabLayoutMediator(mBinding.tabLayout, mBinding.viewPager) { tab, position ->

        }.attach()

        for ((index, itemData)in tabIconArray.withIndex()) {
            //这里不需要newTab(),因为上面的TabLayoutMediator已经创建好了tab
            val tab: TabLayout.Tab? = mBinding.tabLayout.getTabAt(index)
            val binding = MessageItemMessageBinding.inflate(layoutInflater, mBinding.tabLayout, false)
            binding.icon.setImageResource(itemData)
            tab?.customView = binding.root
            mItemRedDotArray.add(binding.redDot)
        }
        initListener()
    }

 

 ViewPager2的已知bug

 因为ViewPager与SwipeRefreshLayout冲突导致RecyclerView或者其他列表布局的item无法点击的问题

 

整理中待续。。。 

End

相关文章: