点击订单菜单应用崩溃,报错Fragment already added: InprogressFragment
解决Fragment already added: InprogressFragment崩溃问题
点击订单菜单时应用崩溃,日志抛出错误:java.lang.IllegalStateException: Fragment already added: InprogressFragment,订单模块包含In Progress和Past Orders两个分页模块,以下是问题分析与解决方案:
问题根源
- 重复创建Adapter与Fragment:每次
onTransactionSuccess回调都会新建SectionsPagerAdapter并绑定到ViewPager,旧Adapter中的Fragment实例仍被FragmentManager持有,再次创建新Fragment时触发重复添加冲突。 - 列表数据未清空:
OrderFragment中的inprogressList和pastordersList是成员变量,多次进入订单页面或重复请求数据时会累积旧数据,加剧Adapter重建时的Fragment冲突。
解决方案
方案1:复用Adapter,避免重复创建
将SectionsPagerAdapter设为OrderFragment的成员变量,初始化时创建一次,后续仅更新数据而非重建Adapter:
修改OrderFragment代码:
class OrderFragment : Fragment(), OrderContract.View{ lateinit var presenter: OrderPresenter var progressDialog: Dialog? = null private var inprogressList: ArrayList<Data>? = ArrayList() private var pastordersList: ArrayList<Data>? = ArrayList() // 新增:将Adapter设为成员变量 private var sectionsPagerAdapter: SectionsPagerAdapter? = null override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) initView() presenter = OrderPresenter(this) // 初始化Adapter并绑定到ViewPager sectionsPagerAdapter = SectionsPagerAdapter(childFragmentManager) viewPager.adapter = sectionsPagerAdapter tabLayout.setupWithViewPager(viewPager) presenter.getTransaction() } override fun onTransactionSuccess(transactionResponse: TransactionResponse) { // 先清空旧数据,避免累积 inprogressList?.clear() pastordersList?.clear() if (transactionResponse.data.isNullOrEmpty()) { include_toolbar.visibility = View.GONE ll_tab.visibility = View.GONE ll_empty.visibility = View.VISIBLE } else { // 填充数据逻辑保持不变 for (a in transactionResponse.data.indices) { if (transactionResponse.data[a].status.equals("ON_DELIVERY", true) || transactionResponse.data[a].status.equals("PENDING", true)) { inprogressList?.add(transactionResponse.data[a]) } else if (transactionResponse.data[a].status.equals("DELIVERY", true) || transactionResponse.data[a].status.equals("DELIVERED", true) || transactionResponse.data[a].status.equals("CANCELLED", true) || transactionResponse.data[a].status.equals("SUCCESS", true)) { pastordersList?.add(transactionResponse.data[a]) } } if (inprogressList.isNullOrEmpty() && pastordersList.isNullOrEmpty()) { include_toolbar.visibility = View.GONE ll_tab.visibility = View.GONE ll_empty.visibility = View.VISIBLE } else { // 更新Adapter数据并通知刷新,而非重建Adapter sectionsPagerAdapter?.setData(inprogressList, pastordersList) sectionsPagerAdapter?.notifyDataSetChanged() include_toolbar.visibility = View.VISIBLE ll_tab.visibility = View.VISIBLE ll_empty.visibility = View.GONE } } } // 新增:销毁视图时清理资源 override fun onDestroyView() { super.onDestroyView() inprogressList?.clear() pastordersList?.clear() sectionsPagerAdapter = null } // 其余方法保持不变 }
方案2:优化Adapter的Fragment管理
如果使用AndroidX库,修改SectionsPagerAdapter的构造参数,使用BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT让FragmentManager更合理管理Fragment生命周期:
class SectionsPagerAdapter(fm: FragmentManager) : FragmentPagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { // 其余代码保持不变 }
方案3:Fragment添加前状态检查(兜底)
在InprogressFragment中添加状态检查,避免重复执行初始化逻辑:
override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) // 仅在Fragment已正确添加到Activity时执行初始化 if (isAdded) { inprogressList = arguments?.getParcelableArrayList("data") if (!inprogressList.isNullOrEmpty()) { adapter = InprogressAdapter(inprogressList!!, this) val layoutManager: RecyclerView.LayoutManager = LinearLayoutManager(activity) rvList.layoutManager = layoutManager rvList.adapter = adapter } } }
内容的提问来源于stack exchange,提问作者Alfian Yuda Pratama
相关产品推荐
相关产品推荐

