2

我在RecyclerView使用GridLayoutManager具有 2 个跨度的 a 时看到了奇怪的行为。

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

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

正如预期的那样。

难道我做错了什么?

谢谢,扎克

4

1 回答 1

3

我发现了问题!

mRecyclerView.scrollToPosition(position)按照我的逻辑调用以重新插入该项目。我错误地从我上面的代码中取出了这段代码,因为我认为它是不相关的(我以后会更加小心)。

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

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

于 2015-08-25T20:51:36.827 回答