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