ViewPager2 не может динамически добавлять удалить фрагмент - PullRequest
0 голосов
/ 24 апреля 2020

Удаление / добавление фрагментов в индексе приводит к неожиданному поведению в Viewpager2. Это было невозможно с ViewPager, но ожидалось, что оно будет работать с Viewpager2. Это вызывает повторяющиеся фрагменты и несинхронно c TabLayout. Вот демонстрационный проект , который воспроизводит эту проблему. Есть кнопка переключения, которая удаляет фрагмент и повторно присоединяет его к определенному индексу. В этом случае прикрепленный фрагмент должен быть зеленого цвета, но он синего цвета и как-то есть 2 синих фрагмента.

вот как выглядит мой адаптер

class ViewPager2Adapter(activity: FragmentActivity) : FragmentStateAdapter(activity) {
    val fragmentList: MutableList<FragmentName> = mutableListOf()

    override fun getItemCount(): Int {
        return fragmentList.size
    }

    override fun createFragment(position: Int): Fragment {
        return when (fragmentList[position]) {
            FragmentName.WHITE -> WhiteFragment()
            FragmentName.RED -> RedFragment()
            FragmentName.GREEN -> GreenFragment()
            FragmentName.BLUE -> BlueFragment()
        }
    }

    fun add(fragment: FragmentName) {
        fragmentList.add(fragment)
        notifyDataSetChanged()
    }

    fun add(index: Int, fragment: FragmentName) {
        fragmentList.add(index, fragment)
        notifyDataSetChanged()
    }

    fun remove(index: Int) {
        fragmentList.removeAt(index)
        notifyDataSetChanged()
    }

    fun remove(name: FragmentName) {
        fragmentList.remove(name)
        notifyDataSetChanged()
    }

    enum class FragmentName {
        WHITE,
        RED,
        GREEN,
        BLUE
    }
}

Я подал ошибку с Google также

1 Ответ

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

Оказывается, вам нужно переопределить эти два метода, если вы работаете с mutable коллекциями в ViewPager2

override fun getItemId(position: Int): Long {
        return fragmentList[position].ordinal.toLong()
    }

    override fun containsItem(itemId: Long): Boolean {
        val fragment = FragmentName.values()[itemId.toInt()]
        return fragmentList.contains(fragment)
    }

Добавление этих двух в мой текущий адаптер решает проблему

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...