如何在 ViewPager2 中获取当前片段
How to get Current Fragment in ViewPager2
我使用了这个 ViewPager2 依赖项:
实施'androidx.viewpager2:viewpager2:1.0.0'
然后我编写代码并为 FragmentStateAdapter 制作适配器,如下所示:
private inner class ViewPagerAdapter(fragmentManager: FragmentManager,
lifecycle: Lifecycle, config: TribunConfig?)
: FragmentStateAdapter(fragmentManager, lifecycle) {
private val config: TribunConfig?
override fun createFragment(position: Int): Fragment {
return TribunNewsFragment.newInstance(if (menuTribun!!.get(position) == "News") "home"
else menuTribun!!.get(position)!!.replace(" ", "").toLowerCase(), config)!!
}
override fun getItemCount(): Int {
return menuTribun!!.size
}
init {
this.config = config
}
}
方法 onCreate
我实现了一些与 viewpager2 及其适配器相关的代码,如下所示:
viewPager2!!.offscreenPageLimit = 1
viewPager2!!.adapter = ViewPagerAdapter(supportFragmentManager, lifecycle, config)
TabLayoutMediator(tabLayout!!, viewPager2!!, TabLayoutMediator.TabConfigurationStrategy { tab: TabLayout.Tab?, position: Int -> tab!!.text = menuTribun!!.get(position) }).attach()
但是当我想进行刷卡刷新时遇到了问题。我的 swipeRefresh 需要当前片段才能访问片段内的方法。但是FragmentStateAdapter中没有NO METHOD getItem
。谁能帮帮我?
- 在您的适配器中创建 属性 以保存所有片段
- 保存当前位置
- 在需要时按位置从片段列表 (属性) 中获取片段
像这样:
val fragments: MutableList<Fragment> = mutableListOf()
private val config: TribunConfig?
override fun createFragment(position: Int): Fragment {
val fragment = TribunNewsFragment.newInstance(if (menuTribun!!.get(position) == "News") "home"
else menuTribun!!.get(position)!!.replace(" ", "").toLowerCase(), config)!!
fragments.add(fragment)
return fragment
}
家长:
yourTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
override fun onTabSelected(tab: TabLayout.Tab?) {
val fragment = adapter.fragments[tab!!.position]
// cast fragment to your fragment class and do what you want
}
override fun onTabUnselected(tab: TabLayout.Tab?) {
}
override fun onTabReselected(tab: TabLayout.Tab?) {
}
})
您还可以使用 when
或 if-else
作为您的片段位置,或者使用您需要的方法创建基础 class 并将获取的片段投射到它。
按照@Oleg 的回答,您可以在适配器中像这样访问片段,而不是创建本地列表并在 createFragment
方法上添加每个片段:
private val fragmentList: List<TribunNewsFragment>
get() {
return fragment.childFragmentManager.fragments.filterIsInstance<TribunNewsFragment>()
}
如果您在另一个片段中创建 ViewPager,请务必使用 childFragmentManager
而不是 fragmentManager
。
它在配置更改后仍然存在,关于@lawonga 对答案主题的评论。
我使用了这个 ViewPager2 依赖项:
实施'androidx.viewpager2:viewpager2:1.0.0'
然后我编写代码并为 FragmentStateAdapter 制作适配器,如下所示:
private inner class ViewPagerAdapter(fragmentManager: FragmentManager,
lifecycle: Lifecycle, config: TribunConfig?)
: FragmentStateAdapter(fragmentManager, lifecycle) {
private val config: TribunConfig?
override fun createFragment(position: Int): Fragment {
return TribunNewsFragment.newInstance(if (menuTribun!!.get(position) == "News") "home"
else menuTribun!!.get(position)!!.replace(" ", "").toLowerCase(), config)!!
}
override fun getItemCount(): Int {
return menuTribun!!.size
}
init {
this.config = config
}
}
方法 onCreate
我实现了一些与 viewpager2 及其适配器相关的代码,如下所示:
viewPager2!!.offscreenPageLimit = 1
viewPager2!!.adapter = ViewPagerAdapter(supportFragmentManager, lifecycle, config)
TabLayoutMediator(tabLayout!!, viewPager2!!, TabLayoutMediator.TabConfigurationStrategy { tab: TabLayout.Tab?, position: Int -> tab!!.text = menuTribun!!.get(position) }).attach()
但是当我想进行刷卡刷新时遇到了问题。我的 swipeRefresh 需要当前片段才能访问片段内的方法。但是FragmentStateAdapter中没有NO METHOD getItem
。谁能帮帮我?
- 在您的适配器中创建 属性 以保存所有片段
- 保存当前位置
- 在需要时按位置从片段列表 (属性) 中获取片段
像这样:
val fragments: MutableList<Fragment> = mutableListOf()
private val config: TribunConfig?
override fun createFragment(position: Int): Fragment {
val fragment = TribunNewsFragment.newInstance(if (menuTribun!!.get(position) == "News") "home"
else menuTribun!!.get(position)!!.replace(" ", "").toLowerCase(), config)!!
fragments.add(fragment)
return fragment
}
家长:
yourTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
override fun onTabSelected(tab: TabLayout.Tab?) {
val fragment = adapter.fragments[tab!!.position]
// cast fragment to your fragment class and do what you want
}
override fun onTabUnselected(tab: TabLayout.Tab?) {
}
override fun onTabReselected(tab: TabLayout.Tab?) {
}
})
您还可以使用 when
或 if-else
作为您的片段位置,或者使用您需要的方法创建基础 class 并将获取的片段投射到它。
按照@Oleg 的回答,您可以在适配器中像这样访问片段,而不是创建本地列表并在 createFragment
方法上添加每个片段:
private val fragmentList: List<TribunNewsFragment>
get() {
return fragment.childFragmentManager.fragments.filterIsInstance<TribunNewsFragment>()
}
如果您在另一个片段中创建 ViewPager,请务必使用 childFragmentManager
而不是 fragmentManager
。
它在配置更改后仍然存在,关于@lawonga 对答案主题的评论。