Android Kotlin:如何从 recyclerview 中成功删除项目、调用 notifyItemRangeChanged() 和动画

Posted

技术标签:

【中文标题】Android Kotlin:如何从 recyclerview 中成功删除项目、调用 notifyItemRangeChanged() 和动画【英文标题】:Android Kotlin: How do I successfully remove item from recyclerview, call notifyItemRangeChanged(), and animate 【发布时间】:2021-04-09 07:35:36 【问题描述】:

我有一个 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”。但是,这样做会摆脱动画。所以我想知道是否有任何方法可以绕过这个,这样我仍然可以拥有正确的位置逻辑以及删除动画。

【问题讨论】:

【参考方案1】:

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

【讨论】:

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

以上是关于Android Kotlin:如何从 recyclerview 中成功删除项目、调用 notifyItemRangeChanged() 和动画的主要内容,如果未能解决你的问题,请参考以下文章

Recycler View 和 DialogFragment 苦苦挣扎(Kotlin)

如何在 kotlin 的 Recycler View Adapter 中添加更多数据列表而不清除先前的数据?

如何使用 lambda 而不是 kotlin 接口

如何从android studio中的recycler视图将数据添加到SQLite数据库中

kotlin android中Recyclerview的适配器类

kotlin android中Recyclerview的适配器类