我已经将FragmentStatePagerAdapter
用于Viewpager
,如果我在api调用之前设置适配器,它可以正常工作。如果我在一段时间后设置了适配器,就会出现异常(我只设置了一次适配器(。
实际上,我不知道具体的问题和解决方案是什么。
请检查以下代码以供参考
适配器:
class MyPagerAdapter(
private val context: Context,
fm: FragmentManager,
private val event: EventInfoResponse
) :
FragmentPagerAdapter(fm,
BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT
) {
private val fragmentsList = arrayListOf<Fragment>()
val fragmentTitleList = arrayListOf<String>()
override fun getItem(position: Int): Fragment {
return when (position) {
0 -> Fragment1.newInstance(event)
else -> Fragment2.newInstance(event.id!!)
}
}
override fun getCount(): Int {
return 2
}
override fun getPageTitle(position: Int): CharSequence? {
return when (position) {
0 -> "title 1"
else -> "title 2"
}
}
}
应用适配器:
vpEvent.apply {
adapter = MyPagerAdapter(requireContext(),childFragmentManager,event!!)
tlEvent.setupWithViewPager(this)
}
异常:
java.lang.IllegalStateException: Fragment already added: Fragment1{9b6bafd (10e16e31-8262-4161-aeff-c78e1180030f) id=0x7f0a065f android:switcher:2131363423:0}
at androidx.fragment.app.FragmentManagerImpl.addFragment(FragmentManagerImpl.java:1379)
at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:399)
at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2079)
at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1869)
问题是您直接在Adapter
中实例化Fragment
。您应该从Adapter
外部创建片段的实例,并注入到Adapter
,然后通过getItem()
方法引入创建CCD_ 8到CCD_。