Все эти классы наследуются от FragmentStateAdapter. Есть еще больше способов. Вы упомянули, что вы хотите провести между фрагментами в ViewPager. Тогда может быть полезным хранить в памяти соседние фрагменты, не уничтожая их. Если у вас не слишком много страниц, я бы рекомендовал использовать FragmentPagerAdapter . Когда у вас есть много фрагментов, вы должны использовать FragmentStatePagerAdapter, который похож на FragmentStateAdapter, для повышения производительности.
Вот рабочий пример:
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, в данном случае хостом является 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
}
}