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

