我一直在争夺与RecyclerView在过去的2天。不同于以往任何时候,我想有滑动将其关闭功能。
我跟着this guide
在这里,我已经实现,唯一的区别是,而不是使用用于输入的预定阵列,我有一个API响应于填充数据。所有这一切似乎也不错,当我打开recyclerview的物品填充,因为他们应该。在为了他们应该。
这里是有趣的开始。如果我尝试滑动来关闭的第一个项目,我得到一个IndexOutOfBounds错误。那是可爱的,我搜索发现,有些人选择的基础的第一个列表上一个新的列表,删除的项,然后原来的列表重新分配给新的列表。 notifyDataSetChanged(完成时)。没有更多的错误,但没有回收视图的动画带来的第二个项目到列表的顶部。任何时候notifyDataSetChanged()被调用列表中不会移动。我向下滚动,备份和项目又回来了。我这样想着。
这个玩了一会儿后,我注意到,虽然在第一个项目的信息出现的是原来的第一个项目,它得到了在列表中的第二项,在视图中的最后一个项目的ID现在下落不明。
下面是一个例子:
我刷卡从列表辞退1,这是什么样的UI显示
代码很多在这里嵌入和它试图这样做引发错误,要点是这里https://gist.github.com/baggednismo/2840d0f777438d29673bc29096153970
尝试删除setHasStableIds(true)
和您的适配器重写getItemId()
。
你告诉第n个视图将始终是列表中代表同一项目的RecyclerView
,当你删除的项目之一,它变得心烦意乱。
(我只是尝试用setHasStableIds(true)
非常简单的例子,并得到了类似的例外,它工作得很好,当我删除它和getItemId()
)
请注意,您的来电notifyItemDeleted()
最好更换整个名单,但如果你确实想要或需要更换整个列表,你应该看看使用DiffUtil
确定,并向列表中选择相应的变化,它会做所有的酷动画,如果相同的项目仍然存在。
如果你想看到我的例子,它在https://gist.github.com/javadude/dec1862b075338790f023b42e01fd953(但它在科特林)
@Scott Stanchfield在他的输入非常正确的。在他的意见,并回答指出变化清理视图帮我找相关的问题的实际看法。该建议仍在实施,是解决方案的一部分。
onBindViewHolder()创建其中它是基于原来的API响应顺序而不是列表顺序recyclerview正在处理关于创建订单项的项目的视图。 onBindViewHolder()被调用每一次新产品出现在滚动列表中,这是问题。这工作正常的列表中的第一个通胀然而一旦该项目被删除,滚动回顶部的第一个项目似乎是项驳回。
原版的:
KitchenOrdersResponse.Item mItem = mKitchenOrdersResponse.getItems().get(i);
解析度:
KitchenOrdersResponse.Item mItem = mItems.get(i);