ViewPager2适配器-FragmentActivity / Fragment / FragmentManager之间的区别

问题描述 投票:0回答:1

我在此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)
android kotlin android-viewpager android-adapter android-viewpager2
1个回答
0
投票

这些类都是从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
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.