android - RecyclerView 与 GridLayoutManager 插入项目错误位置

标签 android android-recyclerview gridlayoutmanager

我在使用具有 2 个跨度的 GridLayoutManagerRecyclerView 中看到奇怪的行为。

我正在尝试获取两列项目:

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 表示我的适配器中的项目列表。 position 表示单击了删除按钮的项目的适配器位置。

删除项目表现完美。我能够删除项目,并且项目会以动画形式填充空白区域。但是,当我尝试撤消删除并将项目添加回来时,回收器 View 会变得困惑,并且会插入空白空间。例如,如果我有以下项目,并且删除了项目 2,然后撤消删除,将会发生以下情况:

0 1
2 3

删除2

0 1
3 

加2回来

0 1
2
3

此时,应放置 3 的位置(第二行、第二列)存在一个“空” View 。如果我查询适配器的大小,我仍然会得到 4 个项目,但不知何故这些项目分散到总共 5 个位置。触摸空白区域不会执行任何操作,但如果我重新定向/配置更改,布局将返回到

0 1
2 3

正如预期的那样。

我做错了什么吗?

谢谢, 扎克

最佳答案

我发现问题了!

我在重新插入项目的逻辑之后调用mRecyclerView.scrollToPosition(position)。我错误地从上面的代码中删除了这一部分,因为我认为它是无关的(将来我会更加小心)。

无论如何,这个调用似乎会导致奇怪的行为。如果我删除该调用,一切都会按预期进行。我怀疑它取消了动画或导致其他东西无法正常工作。

现在我仍然想让我的项目可见(如果用户删除它,滚动它使其离开屏幕,然后点击撤消),但我稍后会弄清楚 - 这现在已经足够好了。

关于android - RecyclerView 与 GridLayoutManager 插入项目错误位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32211800/

相关文章:

android - View 在布局中的份额相等

android - 如何检查安卓设备中 TYPE_SIGNIFICANT_MOTION 传感器的可用性?

android - 如何使用垂直 GridLayoutManager 水平居中 RecyclerView 项目

android - RecyclerView 网格布局管理器不居中项目

java - 在对话窗体中输入文本

Android 试图在 eclipse 中运行我的项目并以 xml.out 结束

java - 在 Recycler View 中展开/折叠卡片有时会导致空白和绘图错误

android - 如何从适配器外部访问 Recyclerview.ViewHolder 参数?

Android EditText 的容器(RecyclerView)在 EditText 聚焦时自动滚动

android - GirdLayoutManager 不工作,kotlin,android