我在此ViewPager2 video中注意到,有3种不同的方式声明带有Fragment
的适配器。它们之间有什么区别,使用ViewPager2的带有选项卡的滑动视图应使用哪个1?
选项1(推荐)
class MyFragmentAdapter (
fa: FragmentActivity
) : FragmentStateAdapter(fa)
选项2
class MyFragmentAdapter (
f: Fragment
) : FragmentStateAdapter(f)
选项3
class MyFragmentAdapter (
fm: FragmentManager,
l: Lifecycle
) : FragmentStateAdapter(fm, l)
这些类都是从FragmentStateAdapter继承的。还有更多的方法。您提到过,您想在ViewPager中的片段之间滑动。如果您不需要太多页面,我建议改用FragmentPagerAdapter。当您有很多片段时,应该使用FragmentStatePagerAdapter。
这是一个有效的示例:
MyPagerAdapter.kt
class MyPagerAdapter(fragmentManager: FragmentManager, private val fragments: List<Fragment>)
: FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
private val retainedFragments: SparseArray<Fragment> = SparseArray()
override fun getItem(position: Int): Fragment {
return if (retainedFragments.get(position) != null)
retainedFragments.get(position)
else
fragments[position]
}
override fun getCount() = this.fragments.size
override fun instantiateItem(container: ViewGroup, position: Int): Any {
val fragment = super.instantiateItem(container, position) as Fragment
retainedFragments.put(position, fragment)
return fragment
}
override fun destroyItem(container: ViewGroup, position: Int, view: Any) {
if (retainedFragments.get(position) != null) {
retainedFragments.remove(position)
}
super.destroyItem(container, position, view)
}
override fun getPageTitle(position: Int): CharSequence? {
return if (position == 0)
context?.getString(R.string.bars_title)
else
context?.getString(R.string.bars_title_presets)
}
}
然后在您的主机Fragment / Activity中,在这种情况下,主机是具有DataBinding的Fragment(此处不相关):
class HostFragment : Fragment() {
private lateinit var pagerAdapter: MyPagerAdapter
private val fragments: MutableList<Fragment> = mutableListOf()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
fragments.add(MyTabFragment.newInstance(0))
fragments.add(MyTabFragment.newInstance(1))
pagerAdapter = MyPagerAdapter(childFragmentManager, fragments)
pagerAdapter.notifyDataSetChanged()
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
setHasOptionsMenu(false)
val binding: FragmentBarsBinding =
DataBindingUtil.inflate(inflater,R.layout.fragment_host, container, false)
binding.apply {
pager.adapter = pagerAdapter
tabs.setupWithViewPager(pager,true)
}
return binding.root
}
}