gpt4 book ai didi

android - 如何使用 Viewpager2 和 Mediator 选项卡布局动态添加和删除 fragment 页面

转载 作者:行者123 更新时间:2023-12-04 13:57:03 25 4
gpt4 key购买 nike

我需要根据服务器配置文件在运行时将 fragment 添加到 viewpager2 以及选项卡。
我见过的大多数 viewpager2 资源都展示了使用新 TabMediator 选项卡布局的静态 viewpager2。
我正在跳过 viewpager,因为我需要添加 viewpager2 支持的 RTL 和垂直滚动。

我最关心的是如何在添加和删除 fragment 时跟踪特定页面/fragment 的索引。
经历过this以教程和代码为例。

最佳答案

这就是你在 Kotlin 中实现它的方式

viewPager = binding.viewPagerContainer
val tabLayout : TabLayout = binding.tabLayout

val fragmentList : MutableList<Pair<String, Fragment>> = mutableListOf()
fragmentList.add(Pair(getString(R.string.assets), AssetFragment.newInstance()))
fragmentList.add(Pair(getString(R.string.news), NewsFragment.newInstance()))

val adapter = AppFragmentAdapter(fragmentList, this)

Handler(Looper.myLooper()!!).postDelayed({
adapter.addFragment(Pair(getString(R.string.videos), VideosFragment.newInstance()))
}, 1000)

Handler(Looper.myLooper()!!).postDelayed({
adapter.removeFragment(2)
}, 2000)

viewPager.adapter = adapter
viewPager.offscreenPageLimit = 2

val layoutInflater : LayoutInflater = LayoutInflater.from(context)

viewPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {

override fun onPageSelected(position: Int) {
super.onPageSelected(position)
val actionBar : ActionBar = (requireActivity() as AppCompatActivity).supportActionBar!!
actionBar.title = adapter.getFragmentName(position)
}

})

TabLayoutMediator(tabLayout, viewPager){ tab, position ->
tab.customView = prepareTabView(layoutInflater, tabLayout, adapter.getFragmentName(position), tabIcons[position])
}.attach()
在这里,我们已经测试了在启动 Activity 或父 Fragment 时使用一些基本延迟来添加和删除最后一个 Fragment。您可以为每个选项卡创建自定义 View ,或者为简单起见仅使用 tab.text = "Tab Name"。
现在,您将与 ViewPager2 一起使用的 Fragment 适配器类型是 FragmentStateAdapter
class AppFragmentAdapter(private val fragmentList: MutableList<Pair<String, Fragment>>, fragment: Fragment) : FragmentStateAdapter(fragment) {

// private var pageIds = fragmentList.map { fragmentList.hashCode().toLong() }

override fun getItemCount(): Int = fragmentList.size

override fun createFragment(position: Int): Fragment {
return fragmentList[position].second
}

// override fun getItemId(position: Int): Long = pageIds[position] // Make sure notifyDataSetChanged() works

// override fun containsItem(itemId: Long): Boolean = pageIds.contains(itemId)

fun getFragmentName(position: Int) = fragmentList[position].first

fun addFragment(fragment: Pair<String, Fragment>) {
fragmentList.add(fragment)
notifyDataSetChanged()
}

fun removeFragment(position: Int) {
fragmentList.removeAt(position)
notifyDataSetChanged()
}

}
如果您的结构是 Parent Fragment > ViewPager2 > Child Fragments 上面的代码可以正常工作。
如果你的结构是 Activity > ViewPager2 > Fragments 只是改变
class AppFragmentAdapter(private val fragmentList: MutableList<Pair<String, Fragment>>, fragment: Fragment) : FragmentStateAdapter(fragment)
class AppFragmentAdapter(private val fragmentList: MutableList<Pair<String, Fragment>>, fragment: FragmentActivity) : FragmentStateAdapter(fragment)
然后代替
val adapter = AppFragmentAdapter(fragmentList, this)
像这样传递 fragment 的 Activity
val adapter = AppFragmentAdapter(fragmentList, requireActivity())
内部 FragmentStateAdapter(fragment)我们的适配器已经处理了应该使用的 FragmentManager。
Activity > ViewPager2 > fragment
public FragmentStateAdapter(@NonNull FragmentActivity fragmentActivity) {
this(fragmentActivity.getSupportFragmentManager(), fragmentActivity.getLifecycle());
}
父 fragment > ViewPager2 > 子 fragment
public FragmentStateAdapter(@NonNull Fragment fragment) {
this(fragment.getChildFragmentManager(), fragment.getLifecycle());
}
我是 deceived首先通过在 SO 中搜索关于使用 ViewPager2 动态添加/删除 fragment ,然后再尝试我能想到的最简单的方法。

关于android - 如何使用 Viewpager2 和 Mediator 选项卡布局动态添加和删除 fragment 页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60130178/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com