RecyclerView 与 GridLayoutManager 插入项目错误位置
RecyclerView with GridLayoutManager insert item wrong position
我在 RecyclerView
使用具有 2 个跨度的 GridLayoutManager
时看到奇怪的行为。
我正在尝试获取两列项目:
0 1
2 3
4 5
6 7
...等等
为了实现这一点,我正在创建一个 GridLayoutManager
像这样:
GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity(), 2);
gridLayoutManager.setOrientation(GridLayoutManager.VERTICAL);
最初这表现得很好。我的物品按照我希望的顺序出现。
但是,我还需要能够从列表中删除项目,然后在用户操作足够快时撤消删除。
要删除项目然后允许 undo/insertion 项目返回,我在用户点击 RecyclerView
项目中的 "remove" 按钮时执行以下逻辑。
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
表示单击删除按钮的项目的适配器位置。
删除项目的行为非常完美。我能够删除项目,并且项目动画以填充空的 spaces。但是,当我尝试撤消删除并重新添加项目时,回收器视图变得混乱并且插入了空 spaces。例如,如果我有以下项目,我删除了项目 2,然后撤消删除,将会发生这种情况:
0 1
2 3
删除 2
0 1
3
加2回来
0 1
2
3
此时,"empty" 视图存在于应放置 3 的位置(第二行,第二列)。如果我查询适配器的大小,我仍然得到 4 个项目,但不知何故这些项目被分散到总共 5 个位置。触摸空白的 space 没有任何作用,但如果我 reorient/config 更改布局会返回到
0 1
2 3
符合预期。
我是不是做错了什么?
谢谢,
扎克
我发现问题了!
我根据我的逻辑调用 mRecyclerView.scrollToPosition(position)
重新插入该项目。我错误地从上面的代码中删除了这一部分,因为我认为它是无关的(以后我会更加小心)。
无论如何,进行此调用似乎会导致古怪的行为。如果我删除了那个电话,一切都会按预期进行。我怀疑它正在取消动画或导致其他东西无法正常工作。
现在我仍然想让我的项目可见(以防用户删除它,滚动它使其离开屏幕,然后点击撤消),但我稍后会解决这个问题 - 这已经足够了现在。
我在 RecyclerView
使用具有 2 个跨度的 GridLayoutManager
时看到奇怪的行为。
我正在尝试获取两列项目:
0 1
2 3
4 5
6 7
...等等
为了实现这一点,我正在创建一个 GridLayoutManager
像这样:
GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity(), 2);
gridLayoutManager.setOrientation(GridLayoutManager.VERTICAL);
最初这表现得很好。我的物品按照我希望的顺序出现。
但是,我还需要能够从列表中删除项目,然后在用户操作足够快时撤消删除。
要删除项目然后允许 undo/insertion 项目返回,我在用户点击 RecyclerView
项目中的 "remove" 按钮时执行以下逻辑。
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
表示单击删除按钮的项目的适配器位置。
删除项目的行为非常完美。我能够删除项目,并且项目动画以填充空的 spaces。但是,当我尝试撤消删除并重新添加项目时,回收器视图变得混乱并且插入了空 spaces。例如,如果我有以下项目,我删除了项目 2,然后撤消删除,将会发生这种情况:
0 1
2 3
删除 2
0 1
3
加2回来
0 1
2
3
此时,"empty" 视图存在于应放置 3 的位置(第二行,第二列)。如果我查询适配器的大小,我仍然得到 4 个项目,但不知何故这些项目被分散到总共 5 个位置。触摸空白的 space 没有任何作用,但如果我 reorient/config 更改布局会返回到
0 1
2 3
符合预期。
我是不是做错了什么?
谢谢, 扎克
我发现问题了!
我根据我的逻辑调用 mRecyclerView.scrollToPosition(position)
重新插入该项目。我错误地从上面的代码中删除了这一部分,因为我认为它是无关的(以后我会更加小心)。
无论如何,进行此调用似乎会导致古怪的行为。如果我删除了那个电话,一切都会按预期进行。我怀疑它正在取消动画或导致其他东西无法正常工作。
现在我仍然想让我的项目可见(以防用户删除它,滚动它使其离开屏幕,然后点击撤消),但我稍后会解决这个问题 - 这已经足够了现在。