RecyclerView与GridLayoutManager插入项目错误的位置

时间:2015-08-25 18:49:44

标签: android android-recyclerview gridlayoutmanager

我在RecyclerView中看到使用GridLayoutManager并且有2个跨度的奇怪行为。

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

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

删除项目表现完美。我可以删除项目和动画填充空白区域的项目。但是,当我尝试撤消删除并将项目添加回来时,回收器视图会混乱,并插入空白空间。例如,如果我有以下项目,并且我删除了第2项,那么取消删除就会发生这种情况:

0 1
2 3

删除2

0 1
3 

再添加2

0 1
2
3

此时,存在“空”视图,其中应放置3(第二行,第二列)。如果我查询适配器的大小我仍然得到4个项目,但不知何故,这些项目分散到总共5个位置。触摸空白区域什么都不做,但如果我重新定位/配置更改布局又回到

0 1
2 3

正如所料。

我做错了吗?

谢谢, 扎克

1 个答案:

答案 0 :(得分:3)

我发现了问题!

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

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

现在我仍然希望我的项目可见(如果用户将其删除,滚动使其在屏幕外,然后点击撤消),但我稍后会想到 - 现在这已经足够了。