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

Kotlin中结束Activity后,如何在原Activity的onResume刷新Fragment?

在Activity的onResume中刷新Fragment(含ListView)的实现方案

下面提供几种实用的实现方式,根据你的项目规模和需求选择即可:

方法一:直接调用Fragment的刷新方法(简单直接)

这种方式适合小型项目,逻辑清晰但耦合度稍高。

  1. 在Fragment中定义公开的刷新方法
    把ListView的更新逻辑封装成一个公开方法,方便Activity调用:

    class MyListFragment : Fragment() {
        private lateinit var listView: ListView
        private lateinit var adapter: ArrayAdapter<String>
        private var dataList = mutableListOf<String>()
    
        override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
            val view = inflater.inflate(R.layout.fragment_list, container, false)
            listView = view.findViewById(R.id.list_view)
            adapter = ArrayAdapter(requireContext(), android.R.layout.simple_list_item_1, dataList)
            listView.adapter = adapter
            return view
        }
    
        // 对外公开的刷新方法
        fun refreshListView() {
            // 替换为实际的获取最新数据逻辑(比如从数据库/网络请求)
            dataList.clear()
            dataList.addAll(getLatestData())
            adapter.notifyDataSetChanged()
        }
    
        private fun getLatestData(): List<String> {
            // 模拟获取最新数据
            return listOf("新条目1", "新条目2", "新条目3")
        }
    }
    
  2. 在Activity的onResume中调用该方法
    获取当前显示的Fragment,判断类型后直接调用刷新方法:

    class MainActivity : AppCompatActivity() {
        override fun onResume() {
            super.onResume()
            val currentFragment = supportFragmentManager.findFragmentById(R.id.fragment_container)
            if (currentFragment is MyListFragment) {
                currentFragment.refreshListView()
            }
        }
    }
    

方法二:接口回调(降低耦合)

通过接口解耦Activity和Fragment,适合需要灵活替换Fragment的场景。

  1. 定义刷新接口

    interface OnFragmentRefreshListener {
        fun onRefresh()
    }
    
  2. Fragment实现接口

    class MyListFragment : Fragment(), OnFragmentRefreshListener {
        // ... 其他代码同方法一
    
        override fun onRefresh() {
            refreshListView()
        }
    }
    
  3. Activity中持有接口实例并调用

    class MainActivity : AppCompatActivity() {
        private var refreshListener: OnFragmentRefreshListener? = null
    
        override fun onAttachFragment(fragment: Fragment) {
            super.onAttachFragment(fragment)
            if (fragment is OnFragmentRefreshListener) {
                refreshListener = fragment
            }
        }
    
        override fun onResume() {
            super.onResume()
            refreshListener?.onRefresh()
        }
    
        override fun onDetachFragment(fragment: Fragment) {
            super.onDetachFragment(fragment)
            if (fragment is OnFragmentRefreshListener) {
                refreshListener = null
            }
        }
    }
    

方法三:ViewModel(生命周期安全+完全解耦,推荐)

利用Jetpack ViewModel实现数据驱动,适合中大型项目,避免内存泄漏问题。

  1. 创建ViewModel管理数据

    class ListViewModel : ViewModel() {
        private val _dataList = MutableLiveData<MutableList<String>>()
        val dataList: LiveData<MutableList<String>> = _dataList
    
        init {
            loadLatestData()
        }
    
        // 刷新数据的方法
        fun loadLatestData() {
            // 模拟获取最新数据
            val newData = mutableListOf("新数据1", "新数据2", "新数据3")
            _dataList.value = newData
        }
    }
    
  2. Fragment中观察数据变化自动更新ListView

    class MyListFragment : Fragment() {
        private lateinit var listView: ListView
        private lateinit var adapter: ArrayAdapter<String>
        private val viewModel: ListViewModel by viewModels()
    
        override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
            val view = inflater.inflate(R.layout.fragment_list, container, false)
            listView = view.findViewById(R.id.list_view)
            adapter = ArrayAdapter(requireContext(), android.R.layout.simple_list_item_1, mutableListOf())
            listView.adapter = adapter
    
            // 观察数据变化,自动更新列表
            viewModel.dataList.observe(viewLifecycleOwner) { newData ->
                adapter.clear()
                adapter.addAll(newData)
                adapter.notifyDataSetChanged()
            }
            return view
        }
    }
    
  3. Activity的onResume中触发数据刷新

    class MainActivity : AppCompatActivity() {
        private val viewModel: ListViewModel by viewModels()
    
        override fun onResume() {
            super.onResume()
            viewModel.loadLatestData()
        }
    }
    

各方法对比

  • 直接调用:简单快速,但Activity和Fragment耦合度高,适合小型项目。
  • 接口回调:降低耦合,比直接调用更灵活。
  • ViewModel:生命周期安全,完全解耦数据和UI,推荐在中大型项目使用,尤其是需要跨页面共享数据的场景。

内容的提问来源于stack exchange,提问作者chanthini begam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 10:06:21