Reputation: 176
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
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
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