具有3个以上选项卡的ViewPager



我正试图用片段在我的应用程序中实现3个以上的选项卡。在FragmentPagerAdapter中,有一个方法getItem返回Frgament,所以我的问题是我们应该使用什么逻辑来缩短代码,因为当我们返回所有可能比大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
}
}

有人能提出建议吗。谢谢

您应该将选项卡列表传递到页面适配器中,并根据选项卡列表的位置创建片段。

例如:

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

好的,首先为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
}
}

最新更新