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

Navigation Drawer Activity中跳转Fragment时如何清空原Fragment全部数据?

问题对应解决方案

方案1:监听导航目的地变化主动触发清空

在宿主MainActivity中监听导航事件,当跳转到Gallery Fragment时主动调用Home Fragment的清空方法,适配Navigation组件的原生逻辑:

// MainActivity.kt onCreate 方法内添加
val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment_content_main) as NavHostFragment
val navController = navHostFragment.navController

navController.addOnDestinationChangedListener { _, destination, _ ->
    // 当导航目标为Gallery Fragment时执行清空逻辑
    if (destination.id == R.id.gallery_fragment) {
        val homeFragment = supportFragmentManager.findFragmentByTag("f${R.id.home_fragment}") as? HomeFragment
        // 调用HomeFragment公开的清空方法
        homeFragment?.clearAllLoadedData()
    }
}

在HomeFragment中新增统一的清空方法,处理所有已加载数据的重置:

// HomeFragment.kt 新增方法
fun clearAllLoadedData() {
    // 清空列表数据
    loadedDataList.clear()
    // 重置适配器
    homeAdapter.submitList(emptyList())
    // 清空所有持有的业务数据引用
    currentSelectedItem = null
    loadedPageNum = 0
    // 其他需要重置的状态变量统一在此处理
}

方案2:使用共享ViewModel统一管理数据(更推荐)

将两个Fragment共用的业务数据存放在和宿主Activity生命周期绑定的共享ViewModel中,无需跨Fragment调用方法,数据变更自动同步:

// SharedViewModel.kt 全局共享数据层
class SharedViewModel : ViewModel() {
    // Home页所有数据统一存在ViewModel中,避免Fragment直接持有
    val homePageData = MutableLiveData<List<HomeDataItem>>()
}

HomeFragment中只做数据观察,不单独持有数据副本:

// HomeFragment.kt onViewCreated 内逻辑
val sharedViewModel = ViewModelProvider(requireActivity())[SharedViewModel::class.java]
sharedViewModel.homePageData.observe(viewLifecycleOwner) { data ->
    // 数据变化时自动更新UI
    homeAdapter.submitList(data)
}

GalleryFragment中删除数据时直接更新ViewModel中的数据源,无需关心HomeFragment的状态:

// GalleryFragment.kt 执行删除操作后
val sharedViewModel = ViewModelProvider(requireActivity())[SharedViewModel::class.java]
// 直接清空共享数据源,HomeFragment恢复显示时会自动拿到空数据,不会触发空指针
sharedViewModel.homePageData.postValue(emptyList())

注意事项

  • 禁止在GalleryFragment中直接持有HomeFragment的强引用,避免内存泄漏和空指针异常
  • 所有可变业务状态优先存储在ViewModel层,不要在Fragment成员变量中存不可恢复的业务数据
  • 可在HomeFragment的onResume方法中添加数据判空逻辑,数据为空时自动触发重新加载
  • 所有访问数据的逻辑提前加判空保护,比如if (loadedDataList?.isNotEmpty() == true) { 执行业务逻辑 }

内容的提问来源于stack exchange,提问作者Usman Haider

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 02:24:04