Kaunain
Kaunain

Reputation: 176

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

Upvotes: 1

Views: 373

Answers (2)

kagkar
kagkar

Reputation: 469

Ok, first create a BaseFragment for pageTitle and further properties/funtions:

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

Your custom class extends this BaseFragment and it will be like:

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

Then create your array:

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

And at last, change your 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
    }
}

Upvotes: 1

Champ Chayangkoon
Champ Chayangkoon

Reputation: 91

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

Upvotes: 1

Related Questions