我在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
正如所料。
我做错了吗?
谢谢, 扎克
答案 0 :(得分:3)
我发现了问题!
我在重新插入项目的逻辑后调用mRecyclerView.scrollToPosition(position)
。我错误地从上面的代码中取出了这篇文章,因为我认为它是无关的(将来我会更加小心)。
无论如何,似乎进行此调用会导致时髦的行为。如果我删除了该调用,一切都按预期工作。我怀疑它正在取消动画或导致其他东西无法正常工作。
现在我仍然希望我的项目可见(如果用户将其删除,滚动使其在屏幕外,然后点击撤消),但我稍后会想到 - 现在这已经足够了。