【问题标题】:How to add another fragment into ViewPager2?如何将另一个片段添加到 ViewPager2 中?
【发布时间】:2021-08-18 09:18:42
【问题描述】:

我正在尝试在 ViewPager2 中动态添加更多片段,但是当我调用 adapter.add(MyNewFragment, position) 时会发生 2 件事,如果我使用 notifyDataSetChange() 不会显示片段,但如果我输入 notifyItemInserted(position) 会显示但应用程序因java.lang.IllegalStateException: Fragment already added 而崩溃。

这是我的适配器类:

class ViewPagerAdapter(
    list: MutableList<Fragment>,
    fm: FragmentManager,
    lifecycle: Lifecycle,
    //fragmentActivity: FragmentActivity
) : FragmentStateAdapter(fm, lifecycle) {

    var fragmentList = list

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

    fun addScreen(fragment: Fragment, position: Int) {
        if(!fragmentList.contains(fragment)){
            fragmentList.add(position, fragment)
            //notifyItemInserted(position)
            notifyDataSetChanged()
        }

    }

    override fun createFragment(position: Int): Fragment {
        return fragmentList[position]
    }


    // I tried to use these methods that I saw here but then the viewpager is totally blank and does not load anything or do the same Fragment already added error.

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

    override fun containsItem(itemId: Long): Boolean = fragmentList.any { it.id.toLong() == itemId }*/
}

这是我的 viewPager 所在的屏幕:

@AndroidEntryPoint
class ViewPagerScreen : Fragment() {

    //...


    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        if (!::savedViewInstance.isInitialized) {
            _binding = FragmentViewPagerScreenBinding.inflate(inflater, container, false)

            //....
            savedViewInstance = binding.root
        }

        binding.viewPager.isSaveEnabled = false

        return savedViewInstance
    }


    fun addNewScreen(){
        adapter.addScreen(NewFragment(), binding.viewPager.currentItem + 1)
    }

    private fun initViewPager() {
        binding.viewPager.offscreenPageLimit = 2
        binding.viewPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
            override fun onPageScrolled(
                position: Int,
                positionOffset: Float,
                positionOffsetPixels: Int
            ) {
                super.onPageScrolled(position, positionOffset, positionOffsetPixels)
            }
        })

        adapter = ViewPagerAdapterByFragments(
            mutableListOf(FirstScreen(), SecondScreen(), ThirdScreen()),
            this@ViewPagerScreen.childFragmentManager,
            lifecycle
        )
        binding.viewPager.adapter = adapter

        binding.viewPager.isUserInputEnabled = false
    }
}

【问题讨论】:

  • createFragment 方法中,您不是在创建新片段,而是从数组中提供现有片段。尝试正确编写此方法,直接在此方法中创建新片段
  • 非常感谢!!现在它就像一个魅力:D

标签: android kotlin android-fragments android-viewpager2


【解决方案1】:

我想我解决了这个问题,感谢 @snachmsm 指出我在哪里寻找。

我所做的很简单,我只需将参数 list: MutableList&lt;Fragment&gt; 更改为 list:MutableList&lt;Pair&lt;String,Fragment&gt;&gt;,其中我的 String 是我的 fragmentId。然后在方法createFragment 上返回一个基于我的fragmentId 的新片段。

这是代码本身:

override fun createFragment(position: Int): Fragment {
        return when (fragmentList!![position]!!.first) {
            "firstScreen" -> return FirstScreen()
            "secondScreen" ->return SecondScreen()
            "thirdScreen" ->return ThirdScreen()
            "newScreen" -> return NewScreen()
            else -> AnotherScreen()
        }
    }

我的addScreenMethod() 现在看起来像这样:

fun addScreen(newfragment: Pair<String, Fragment>, position: Int) {
        val result = fragmentList.find {
            it.first == newfragment.first
        }
 
        if (result == null) {
            fragmentList.add(position, newfragment)
            notifyItemInserted(position)
        }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多