【问题标题】:Android Kotlin: How do I successfully remove item from recyclerview, call notifyItemRangeChanged(), and animateAndroid Kotlin:如何从 recyclerview 中成功删除项目、调用 notifyItemRangeChanged() 和动画
【发布时间】:2025-11-28 07:40:01
【问题描述】:

我有一个 RecyclerView,我正在尝试实现删除功能。为了得到itemViews的正确位置,我在删除后调用了notifyItemRangeChanged()。但是,当我这样做时,itemView 向右滑动并被删除的酷动画现在消失了。看起来 notifyItemRangeChanged() 会切断由 notifyItemRemoved() 创建的动画。有什么办法可以让动画和项目正确删除?

活动代码:

        circuitsObject?.circuits?.remove(circuitsObject?.circuits?.get(position))
        recyclerView.adapter?.notifyItemRemoved(position)
        recyclerView.adapter?.notifyItemRangeChanged(position, circuitsObject?.circuits!!.size)

        if (recyclerView.adapter?.itemCount!! == 0) {
            loadEmptyUI()
        }

适配器代码:

class CircuitViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
...
itemView.setOnClickListener { clickListener(circuit) }
itemView.setOnLongClickListener {
    onLongClickListener(position)
    true
}

参数“位置”直接来自 ViewHolder。为了弥补位置与我的数据索引不匹配的事实,我使用了“notifyItemRangeChanged”。但是,这样做会摆脱动画。所以我想知道是否有任何方法可以绕过这个,这样我仍然可以拥有正确的位置逻辑以及删除动画。

【问题讨论】:

    标签: android kotlin android-recyclerview


    【解决方案1】:

    您无需在调用notifyItemRemoved(...) 之后再调用notifyItemRangeChanged(...)

    【讨论】:

    • 如果我不调用它,那么排序就会混乱。检索到的位置不再对应于我数据中的同一项目。这有意义吗?
    • 你能显示更多代码吗?我的猜测是您可能在侦听器中使用 onBindViewHolder 方法的 position 参数。我的假设正确吗?
    • 是的,我是对的。让我尝试编辑更多代码
    • 尝试使用 viewHolder.layoutPosition 而不是你的听众中的位置。这应该可以解决位置与索引不匹配的问题。
    • 出于某种原因,即使在使用 holder.layoutPosition 代替 position 之后,索引值也是错误的,并且在某些情况下超出了范围。