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 中添加更多数据列表而不清除先前的数据?
如何从android studio中的recycler视图将数据添加到SQLite数据库中