【问题标题】:ViewPager with more than 3 Tabs具有 3 个以上选项卡的 ViewPager
【发布时间】:2020-11-04 13:28:38
【问题描述】:

我正在尝试在我的应用程序中使用片段实现 3 个以上的选项卡。在 FragmentPagerAdapter 中,有一种方法 getItem 返回 Fragment 所以我的问题是我们应该使用什么逻辑来缩短代码,因为当我们返回所有可能超过 10 个或更多的片段时,它会非常混乱

这是我的 PagerAdapter

class PageAdapter(fragmentManager: FragmentManager, private val tabCount: Int) :
FragmentPagerAdapter(fragmentManager, tabCount) {

override fun getCount() = tabCount

override fun getItem(position: Int): Fragment {
    when (position) {
        0 -> return NewsCategoryOneFragment()
        1 -> return NewsCategoryTwoFragment()
        2 -> return NewsCategoryThreeFragment()
        3 -> return NewsCategoryFourFragment()
        4 -> return NewsCategoryFiveFragment()
    }
    return NewsCategoryOneFragment()
}

override fun getPageTitle(position: Int): CharSequence? {
    when (position) {
        0 -> return "Buzzfeed"
        1 -> return "CNN"
        2 -> return "ESPN"
        3 -> return "Fortune"
        4 -> return "Fox News"
    }
    return null
}
}

任何人都可以建议。 谢谢你

【问题讨论】:

  • 您可以传递一个包含这些片段的列表并按位置获取片段。对于标题,创建一个包含“title”属性的“BaseFragment”。
  • 但是我怎样才能创建我不理解的这些片段的列表@kagkar

标签: android kotlin android-viewpager fragment


【解决方案1】:

您应该将标签列表传递给页面适配器,并从您的标签列表中按位置创建片段。

例如:

data class TabItem(val title: String)

val tabItemList = listOf(
    TabItem("Buzzfeed"),
    TabItem("CNN"),
    TabItem("CNN"),
    TabItem("Fortune"),
    TabItem("Fox News")
)

class PageAdapter(
    fragmentManager: FragmentManager,
    private val tabItemList: List<TabItem>
) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {

    override fun getCount() = tabItemList.size

    override fun getItem(position: Int): Fragment {
        return NewsCategoryFragment.newInstance(position)
    }

    override fun getPageTitle(position: Int): CharSequence? {
        return tabItemList[position].title
    }
}

class NewsCategoryFragment : Fragment() {
    // ...

    companion object {
        const val KEY_CATEGORY = "category"

        fun newInstance(category: Int): NewsCategoryFragment {
            return NewsCategoryFragment().apply {
                arguments = Bundle().apply { putInt(KEY_CATEGORY, category) }
            }
        }
    }
}

【讨论】:

    【解决方案2】:

    好的,首先为 pageTitle 和其他属性/功能创建一个 BaseFragment:

    open class BaseFragment: Fragment() {
        var pageTitle: String = "Default Title"
    }
    

    您的自定义类扩展了这个 BaseFragment,它会像:

    class CustomFragment: BaseFragment() {
        companion object {
           fun newInstance(pageTitle: String): CustomFragment {
           val fragment = CustomFragment()
           val args = Bundle()
           args.putString("title", pageTitle)
           fragment.arguments = args
           return fragment
        }
    }
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val args = Bundle()
        pageTitle = args.getString("title")!!
        }
    }
    

    然后创建你的数组:

    val fragmentList = listOf(
        CustomFragment.newInstance("title1"),
        CustomFragment.newInstance("title2"),
        CustomFragment.newInstance("title3"),
        CustomFragment.newInstance("title4"),
        CustomFragment.newInstance("title5")
    )
    

    最后,更改您的 PagerAdapter:

    class PageAdapter(fragmentManager: FragmentManager, private val fragmentList: List<BaseFragment>) :
        FragmentPagerAdapter(fragmentManager, fragmentList.size) {
    
        override fun getCount() = fragmentList.size
    
        override fun getItem(position: Int): Fragment {
            return fragmentList.get(position)
        }
    
        override fun getPageTitle(position: Int): CharSequence? {
            return fragmentList.get(position).pageTitle
        }
    }
    

    【讨论】:

    • 感谢您的回复.....标签名称是否以小写字母显示
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    • 2013-09-26
    • 1970-01-01
    相关资源
    最近更新 更多