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

Android Kotlin中ListAdapter搭配DiffUtil更新视图不生效问题咨询

问题根因

代码中的核心问题是调用submitList时始终传入同一个MutableList实例:ListAdapter内部执行DiffUtil差异计算前,会先校验新旧列表是否为同一内存引用,若引用完全相同则会直接判定列表无变更,跳过后续的差异对比和UI更新逻辑,只有调用notifyDataSetChanged()全量刷新或重设Adapter时才会强制重绘所有条目。

DiffUtil适用场景
  • 列表存在频繁的局部增删改操作,无需全量重绘整个RecyclerView,可大幅降低渲染开销,同时保留系统自带的条目增删改动画
  • 列表数据量较大,全量调用notifyDataSetChanged()会造成界面卡顿、滑动掉帧的场景
  • 需要精准定位变更条目位置,仅对修改过的条目执行局部更新的场景
正确触发列表重绘的实现方案

只需修改MainActivity中点击事件的逻辑,每次更新列表时提交新的列表副本即可:

class MainActivity : AppCompatActivity() {

    private var list = mutableListOf(1, 2, 3, 4, 5, 6, 7, 8, 9)
    private lateinit var binding: ActivityMainBinding
    var i = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        Log.e("List", " $list")
        val intAdapter = IntAdapter()
        binding.recylerview.adapter = intAdapter
        intAdapter.submitList(list)
        binding.button.setOnClickListener {
            // 核心修改:创建新的列表副本
            val newList = list.toMutableList()
            newList.add(++i)
            list = newList
            intAdapter.submitList(newList)
        }
    }
}

额外注意:如果列表条目为自定义实体类,areItemsTheSame方法请对比条目的唯一主键(如服务端返回的itemId),areContentsTheSame方法对比所有和UI展示相关的字段是否一致,避免出现内容修改后不触发更新的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 11:45:03