Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 带有GridLayoutManager的RecyclerView插入项的位置错误_Android_Android Recyclerview_Gridlayoutmanager - Fatal编程技术网

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,所以我不认为这是很不幸的。