这些类都继承自 FragmentStateAdapter。还有更多的方法。您提到过,您想在 ViewPager 中的片段之间滑动。那么将相邻的片段保存在内存中而不破坏它们可能是一个优势。
如果您没有太多页面,我建议您改用FragmentPagerAdapter。当 Fragment 很多时,最好使用类似于 FragmentStateAdapter 的 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
}
}