Адаптеры ViewPager2 - разница между FragmentActivity / Fragment / FragmentManager - PullRequest
0 голосов
/ 01 апреля 2020

В этом видео ViewPager2 я заметил, что существует 3 различных способа объявления адаптера с Fragment с. В чем разница между ними и тем, какую 1 следует использовать для просмотра со сдвигом с помощью вкладок с использованием ViewPager2?

Вариант 1 (рекомендуется)

class MyFragmentAdapter (
    fa: FragmentActivity
) : FragmentStateAdapter(fa)

Вариант 2

class MyFragmentAdapter (
    f: Fragment
) : FragmentStateAdapter(f)

Вариант 3

class MyFragmentAdapter (
    fm: FragmentManager,
    l: Lifecycle
) : FragmentStateAdapter(fm, l)

Ответы [ 2 ]

0 голосов
/ 01 апреля 2020

В Viewpager2 есть только один тип адаптера FragmentStateAdapter

Кажется, что нет разницы в том, как они ведут себя, они просто разные конструкторы одного и того же FragmentStateAdapter. Какой из них использовать, в основном зависит от того, где вы создаете viewpager2

Дайте ему FragmentActivity, если вы создаете viewpager2 в Activity, это ярлык для третьего метода

Give - это Fragment, если вы создаете viewpager2 в родительском Fragement, это сокращение к третьему методу

Третий из FragmentManager и Lifecycle - это фактически то, что требуется для работы, см. исходный код для конструкторов viewpager2 https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-master-dev/viewpager2/viewpager2/src/main/java/androidx/viewpager2/adapter/FragmentStateAdapter.java#109

0 голосов
/ 01 апреля 2020

Все эти классы наследуются от 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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...