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

创建RecyclerView适配器时遇AsyncListDiffer参数不匹配问题,如何解决?

修复RecyclerView适配器的AsyncListDiffer初始化错误

问题根源

你遇到的AsyncListDiffer构造参数错误,核心问题有3点:

  • AsyncListDiffer被错误放在NoteViewHolder内部,它的第一个构造参数需要RecyclerView.Adapter实例,而非ViewHolder
  • DiffUtil.ItemCallback的方法逻辑写反:areItemsTheSame应仅判断数据唯一标识,areContentsTheSame才判断内容是否完全一致
  • getItemCount未实现,且无法正确访问differ的列表数据

修复后的完整代码

import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.AsyncListDiffer
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
import com.mahi.notesapp.databinding.NoteLayoutBinding
import com.mahi.notesapp.model.Note

class NoteAdapter: RecyclerView.Adapter<NoteAdapter.NoteViewHolder>() {

    // 将DiffUtil回调和AsyncListDiffer移到Adapter类层级
    private val differCallback = object : DiffUtil.ItemCallback<Note>() {
        // 判断是否为同一数据项(仅用唯一标识id)
        override fun areItemsTheSame(oldItem: Note, newItem: Note): Boolean {
            return oldItem.id == newItem.id
        }

        // 判断数据内容是否一致
        override fun areContentsTheSame(oldItem: Note, newItem: Note): Boolean {
            return oldItem.noteTitle == newItem.noteTitle &&
                    oldItem.noteBody == newItem.noteBody
        }
    }

    // 传入当前Adapter实例作为第一个参数
    val differ = AsyncListDiffer(this, differCallback)

    class NoteViewHolder(val itemBinding: NoteLayoutBinding): RecyclerView.ViewHolder(itemBinding.root)

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NoteViewHolder {
        return NoteViewHolder(NoteLayoutBinding.inflate(LayoutInflater.from(parent.context), parent, false))
    }

    // 实现getItemCount,返回differ的当前列表长度
    override fun getItemCount(): Int {
        return differ.currentList.size
    }

    override fun onBindViewHolder(holder: NoteViewHolder, position: Int) {
        // 正确获取当前位置的Note数据并绑定UI
        val currentNote = differ.currentList[position]
        holder.itemBinding.tvNoteTitle.text = currentNote.noteTitle
        holder.itemBinding.tvNoteBody.text = currentNote.noteBody
    }
}

关键修改说明

  • 把differCallback和differ从NoteViewHolder移到NoteAdapter类内部,确保AsyncListDiffer能拿到正确的Adapter实例
  • 修正DiffUtil.ItemCallback逻辑:areItemsTheSame只对比id(唯一标识),areContentsTheSame对比标题和内容
  • 实现getItemCount,返回differ.currentList.size,让RecyclerView知晓列表长度
  • 在onBindViewHolder中完成数据到UI组件的绑定

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 17:55:06