Kotlin中结束Activity后,如何在原Activity的onResume刷新Fragment?
在Activity的onResume中刷新Fragment(含ListView)的实现方案
下面提供几种实用的实现方式,根据你的项目规模和需求选择即可:
方法一:直接调用Fragment的刷新方法(简单直接)
这种方式适合小型项目,逻辑清晰但耦合度稍高。
在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") } }在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的场景。
定义刷新接口
interface OnFragmentRefreshListener { fun onRefresh() }Fragment实现接口
class MyListFragment : Fragment(), OnFragmentRefreshListener { // ... 其他代码同方法一 override fun onRefresh() { refreshListView() } }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实现数据驱动,适合中大型项目,避免内存泄漏问题。
创建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 } }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 } }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
相关产品推荐
相关产品推荐

