Search code examples
androidkotlinandroid-viewpagerfragment

ViewPager with more than 3 Tabs


I am trying to implement more than 3 tabs in my app with fragments. In FragmentPagerAdapter ,there is one method getItem that returns Frgament so my question is what the logic should we use to shorten the code because it will be so messy when we return all the fragments which may be 10 or more than that

here is my 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
}
}

can anyone plz suggest. Thank You


Solution

  • You should pass a tab list into page adapter and create fragment by position from your tab list.

    For Example:

    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) }
                }
            }
        }
    }