RecyclerView总是从观点和错误的位置0删除项目时删除最后一个元素

问题描述 投票:0回答:2

我一直在争夺与RecyclerView在过去的2天。不同于以往任何时候,我想有滑动将其关闭功能。

我跟着this guide

在这里,我已经实现,唯一的区别是,而不是使用用于输入的预定阵列,我有一个API响应于填充数据。所有这一切似乎也不错,当我打开recyclerview的物品填充,因为他们应该。在为了他们应该。

这里是有趣的开始。如果我尝试滑动来关闭的第一个项目,我得到一个IndexOutOfBounds错误。那是可爱的,我搜索发现,有些人选择的基础的第一个列表上一个新的列表,删除的项,然后原来的列表重新分配给新的列表。 notifyDataSetChanged(完成时)。没有更多的错误,但没有回收视图的动画带来的第二个项目到列表的顶部。任何时候notifyDataSetChanged()被调用列表中不会移动。我向下滚动,备份和项目又回来了。我这样想着。

这个玩了一会儿后,我注意到,虽然在第一个项目的信息出现的是原来的第一个项目,它得到了在列表中的第二项,在视图中的最后一个项目的ID现在下落不明。

下面是一个例子:

  1. 文=福克斯ID = C
  2. 文本=狗ID = B
  3. 文本=猪ID = C

我刷卡从列表辞退1,这是什么样的UI显示

  1. 文本=福克斯ID = B
  2. 文本=狗ID = C

代码很多在这里嵌入和它试图这样做引发错误,要点是这里https://gist.github.com/baggednismo/2840d0f777438d29673bc29096153970

android android-recyclerview swipe
2个回答
0
投票

尝试删除setHasStableIds(true)和您的适配器重写getItemId()

你告诉第n个视图将始终是列表中代表同一项目的RecyclerView,当你删除的项目之一,它变得心烦意乱。

(我只是尝试用setHasStableIds(true)非常简单的例子,并得到了类似的例外,它工作得很好,当我删除它和getItemId()

请注意,您的来电notifyItemDeleted()最好更换整个名单,但如果你确实想要或需要更换整个列表,你应该看看使用DiffUtil确定,并向列表中选择相应的变化,它会做所有的酷动画,如果相同的项目仍然存在。

如果你想看到我的例子,它在https://gist.github.com/javadude/dec1862b075338790f023b42e01fd953(但它在科特林)


0
投票

@Scott Stanchfield在他的输入非常正确的。在他的意见,并回答指出变化清理视图帮我找相关的问题的实际看法。该建议仍在实施,是解决方案的一部分。

onBindViewHolder()创建其中它是基于原来的API响应顺序而不是列表顺序recyclerview正在处理关于创建订单项的项目的视图。 onBindViewHolder()被调用每一次新产品出现在滚动列表中,这是问题。这工作正常的列表中的第一个通胀然而一旦该项目被删除,滚动回顶部的第一个项目似乎是项驳回。

原版的:

KitchenOrdersResponse.Item mItem = mKitchenOrdersResponse.getItems().get(i);

解析度:

KitchenOrdersResponse.Item mItem = mItems.get(i);
© www.soinside.com 2019 - 2024. All rights reserved.