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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 11:24:01