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

Kotlin+MVVM架构下AddFragment添加数据后RecyclerView不显示怎么办

问题原因&修复方案

1 核心问题:ViewModel作用域错误

你当前在两个Fragment中均使用by viewModels<MovieViewModel>()获取ViewModel实例,该方法默认生成绑定当前Fragment生命周期的独立实例,因此AddFragment中添加数据的操作是在另一个ViewModel实例中执行,ListFragment完全收不到更新通知。
修复方法:将两个Fragment中获取ViewModel的代码替换为Activity作用域的实现,保证两个Fragment拿到同一个ViewModel实例:

// 把AddFragment和ListFragment中原有的 by viewModels<MovieViewModel>() 替换成下面的代码
private val movieViewModel: MovieViewModel by activityViewModels()

2 次要问题:空列表索引越界风险

ListFragment中观察LiveData的代码直接调用data.get(0),当列表还没有数据时会触发索引越界崩溃,建议添加判断逻辑:

movieViewModel.movies.observe(viewLifecycleOwner, { data ->
    adapter.setData(data)
    // 增加非空和长度判断再取值
    if (data.isNotEmpty()) {
        binding.textView.setText(data[0].movieName)
    }
})

可选优化点

可以把ViewModel中的MutableLiveData对外暴露为不可变类型,避免外部直接修改值,代码更规范:

class MovieViewModel : ViewModel() {
    private val _movies = MutableLiveData<ArrayList<Movie>>()
    val movies: LiveData<ArrayList<Movie>> = _movies
    private val movieList = arrayListOf<Movie>()

    fun addMovie(movie: Movie) {
        movieList.add(movie)
        _movies.value = movieList
    }
}

修改完成后重新运行即可在ListFragment的RecyclerView中看到新增的条目。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 11:09:05