Android 带有GridLayoutManager的RecyclerView插入项的位置错误
我在一个Android 带有GridLayoutManager的RecyclerView插入项的位置错误,android,android-recyclerview,gridlayoutmanager,Android,Android Recyclerview,Gridlayoutmanager,我在一个RecyclerView中看到了奇怪的行为,它使用了一个带有两个跨度的GridLayoutManager 我正在尝试获取两列项目: 0 1 2 3 4 5 6 7 。。。等等 为了实现这一点,我创建了一个GridLayoutManager,如下所示: GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity(), 2); gridLayoutManager.setOrientation
RecyclerView
中看到了奇怪的行为,它使用了一个带有两个跨度的GridLayoutManager
我正在尝试获取两列项目:
0 1
2 3
4 5
6 7
。。。等等
为了实现这一点,我创建了一个GridLayoutManager
,如下所示:
GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity(), 2);
gridLayoutManager.setOrientation(GridLayoutManager.VERTICAL);
最初,这表现得非常完美。我的项目按我希望的顺序显示
但是,我还需要能够从列表中删除项目,然后在用户动作足够快的情况下撤消删除
要删除项目,然后允许撤消/插入项目,当用户点击RecyclerView
项目中的“删除”按钮时,我将执行以下逻辑
final Item = mItems.getItem(position);
mItems.remove(position);
notifyItemRemoved(position);
// Give the user a chance to undo the removal
Snackbar.make(getView(),
"Item Removed", Snackbar.LENGTH_LONG)
.setAction(R.string.item_removed_snackbar_undo, new View.OnClickListener()
{
@Override
public void onClick(View view)
{
mItems.add(position, item);
notifyItemInserted(position);
}
}).show();
mItems
表示适配器中的项目列表<代码>位置表示单击了“删除”按钮的项目的适配器位置
删除项目的行为完美。我可以删除项目,项目动画,以填补空白。但是,当我尝试撤消删除并重新添加项目时,recycler视图会变得混乱,并插入空白。例如,如果我有以下项目,并且我删除了项目2,则取消删除,这就是发生的情况:
0 1
2 3
删除2
0 1
3
加2回
0 1
2
3
此时,一个“空”视图存在于应该放置3的位置(第二行,第二列)。如果我查询适配器的大小,我仍然会得到4个项目,但不知何故,这些项目被分散到总共5个位置。触摸空白空间没有任何作用,但是如果我重新定向/config更改布局,它会返回到
0 1
2 3
正如所料
我做错什么了吗
谢谢,
扎克我发现了问题 我正在调用
mRecyclerView.scrollToPosition(position)
在我的逻辑之后重新插入该项。我错误地从上面的代码中删除了这一部分,因为我认为它与此无关(以后我会更加小心)
不管怎么说,这似乎导致了这种古怪的行为。如果我删除了那个呼叫,一切都会正常工作。我怀疑这是取消动画或导致其他东西无法正常工作
现在我仍然想让我的项目可见(如果用户删除了它,滚动使其脱离屏幕,然后单击“撤消”),但我稍后会解决这个问题-现在这已经足够好了。我遇到了类似的问题,但后来我意识到onCreateViewHolder()出现了这种情况方法返回缓存的RecyclerView.ViewHolder-onCreateViewHolder必须始终返回RecyclerView.ViewHolder或RecyclerView.ViewHolder的新实例,该实例是在RecyclerView池外部创建的,该错误为快速响应创建了大量崩溃。我的代码总是在onCreateViewHolder()方法中返回一个新的ViewHolder,所以我不认为这是很不幸的。