You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

点击订单菜单应用崩溃,报错Fragment already added: InprogressFragment

解决Fragment already added: InprogressFragment崩溃问题

点击订单菜单时应用崩溃,日志抛出错误:java.lang.IllegalStateException: Fragment already added: InprogressFragment,订单模块包含In Progress和Past Orders两个分页模块,以下是问题分析与解决方案:

问题根源

  1. 重复创建Adapter与Fragment:每次onTransactionSuccess回调都会新建SectionsPagerAdapter并绑定到ViewPager,旧Adapter中的Fragment实例仍被FragmentManager持有,再次创建新Fragment时触发重复添加冲突。
  2. 列表数据未清空: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 06:01:05