ListAdapter submitList仅首次生效 RecyclerView分页加载后列表不更新
问题根因
你遇到的问题是ListAdapter的submitList机制的固有特性导致的:submitList接收列表参数时,会优先判断传入的列表是否和当前Adapter内部持有的列表是同一个内存引用。如果是同一个对象,会直接跳过Diff计算流程,认为列表没有发生变更,也就不会触发RecyclerView的刷新。
你在原有全局movieList对象上调用addAll新增数据后,直接把同一个对象传入submitList,所以除了第一次传入新对象时会生效,后续调用都不会触发更新。你本地打印的列表大小正确是因为你修改的是自己持有的列表对象,和Adapter内部的校验逻辑无关。
解决方案
最简单的修改方式是提交列表时生成一个新的列表副本传入即可:
movieList.addAll(it.movieList) // toList()会生成新的不可变列表副本,每次传入的都是不同对象 adapter.submitList(movieList.toList()) Log.wtf("WTF", movieList.size.toString())
如果你想同步更新全局持有的列表为新副本,也可以写成:
val newList = mutableListOf<MovieItem>().apply { addAll(movieList) addAll(it.movieList) } movieList = newList adapter.submitList(newList)
优化建议
你当前的DiffUtil.ItemCallback里areContentsTheSame仅比较了title字段,如果后续MovieItem的其他展示字段(比如评分、海报地址)发生变更,UI也不会刷新。如果你的MovieItem是Kotlin数据类(data class),建议直接全量比较内容:
override fun areContentsTheSame(oldItem: MovieItem, newItem: MovieItem): Boolean { return oldItem == newItem }
内容的提问来源于stack exchange,提问作者Bitwise DEVS
相关产品推荐
相关产品推荐

