Android开发Android开发经验谈Android技术知识

06 ViewPager2-使用

2021-07-26  本文已影响0人  凤邪摩羯

一、ViewPager2的变化

ViewPager2是用来替换ViewPager的,ViewPager2是final修饰的,直接继承ViewGroup,其内部是使用RecyclerView,ViewPager2默认是使用懒加载。
ViewPager2与ViewPager的改进:
(1)支持Right to Left布局,即从右向左布局
(2)支持竖向滚动
(3)支持notifyDataSetChanged
(4)支持懒加载
而api上的变动如下:
(1)FragmentStateAdapter替换了原来的 FragmentStatePagerAdapter
(2)RecyclerView.Adapter替换了原来的 PagerAdapter
(3)registerOnPageChangeCallback替换了原来的 addPageChangeListener

二、ViewPager2的使用

1.单纯使用ViewPager2

projectViewPager.adapter = object: FragmentStateAdapter(this) {
    override fun getItemCount(): Int = mProjectTypeList.size

    override fun createFragment(position: Int): Fragment = chooseFragment(position)

}

ViewPager2使用的Adapter是FragmentStateAdapter和RecyclerView.Adapter。如果是需要展示Fragment,则使用FragmentStateAdapter;如果是需要展示View,则使用RecyclerView.Adapter

2.ViewPager2+TabLayout联动

viewPager.adapter = object: FragmentStateAdapter(this){
    override fun getItemCount(): Int = systemBean.children.size

    override fun createFragment(position: Int): Fragment = SystemTypeFragment.newInstance(systemBean.children[position].id, false)

}
// 联动ViewPager2和TabLayout
TabLayoutMediator(tabLayout, viewPager){
    tab, position -> tab.text = systemBean.children[position].name
}.attach()

ViewPager2的联动需要配合TabLayoutMediator使用。
在TabLayoutMediator的构造器中,第三个参数是TabConfigurationStrategy接口实现对象,接口如下:

public interface TabConfigurationStrategy {
  /**
   * Called to configure the tab for the page at the specified position. Typically calls {@link
   * TabLayout.Tab#setText(CharSequence)}, but any form of styling can be applied.
   *
   * @param tab The Tab which should be configured to represent the title of the item at the given
   *     position in the data set.
   * @param position The position of the item within the adapter's data set.
   */
  void onConfigureTab(@NonNull TabLayout.Tab tab, int position);
}

第一个参数就是TabLayout当前的Tab,而position就是当前Tab的索引。这个方法是将ViewPager2与TabLayout绑定之后遍历调用的。
通过这个Tab对象,可以对每一个Tab做自定义,比如自定义Tab的文本显示内容,或者Tab的显示样式。
上面的例子中就是自定义每个Tab的文本内容。

TabLayoutMediator(tabLayout, viewPager) { tab, position ->
    tab.customView = mTabs[position]
    // tab.text = mTitles[position]
}.attach()

这个就在自定义Tab的显示View的。
这里的mTabs是一个自定义View的列表

3.ViewPager2与BottomNavigationView联动

这个做法其实就是给BottomNavigationView添加setOnNavigationItemSelectedListener监听,然后根据选择的position切换ViewPager2

    private val navigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener {
        when(it.itemId) {
            R.id.home -> {
                switchFragment(0)
            }
            R.id.blog -> {
                switchFragment(1)
            }
//            R.id.search -> {
//                switchFragment(2)
//            }
            R.id.project -> {
                switchFragment(2)
            }
            R.id.personal -> {
                switchFragment(3)
            }
        }
        true
    }

main_nav_view.setOnNavigationItemSelectedListener(navigationItemSelectedListener)

private fun switchFragment(position: Int): Boolean {
    // 设置为false,就是取消点击item的时候viewpager的滑动效果
    mainViewPager.setCurrentItem(position, false)
    return true
}

private fun initViewPager() {
    mainViewPager.run {
        isUserInputEnabled = false
        offscreenPageLimit = 2
        adapter = object: FragmentStateAdapter(activity!!) {
            override fun getItemCount(): Int = fragmentList.size

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

上一篇下一篇

猜你喜欢

热点阅读