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
相关产品推荐
相关产品推荐

