【发布时间】:2015-01-06 14:17:25
【问题描述】:
我正在尝试在RecyclerView 和StaggeredGridLayoutManager 中显示三个(至少我遇到问题的情况)项目和两列。第一项跨越两行。下面是它的样子:
现在,我将项目“项目 2”移到顶部。这是我在适配器中调用的代码(这是我编写的一个示例,用于演示我在更复杂的项目中遇到的问题):
private int findById(int id) {
for (int i = 0; i < items.size(); ++i) {
if (items.get(i).title.equals("Item " + id)) {
return i;
}
}
return -1;
}
// Moving the item "Item 2" with id = 2 and position = 0
public void moveItem(int id, int position) {
final int idx = findById(id);
final Item item = items.get(idx);
if (position != idx) {
items.remove(idx);
items.add(position, item);
notifyItemMoved(idx, position);
//notifyDataSetChanged();
}
}
之后,数组就可以了:[Item 2, Item 1, Item 3]。但是,观点还差得很远:
如果我触摸RecyclerView(如果没有足够的项目可以滚动,足以触发过度滚动效果),第 2 项将向左移动,我希望首先看到它(带有漂亮的动画):
正如您可能在代码中看到的那样,我尝试通过调用 notifyDataSetChanged() 来替换 notifyItemMoved(idx, position)。它可以工作,但变化不是动画。
我写了一个完整的示例来演示这一点,并将其放在GitHub 上。它几乎是最小的(有移动项目和切换它们的跨度的选项)。
我看不出我做错了什么。这是StaggeredGridLayoutManager 的错误吗?我想避免notifyDataSetChanged(),因为我想保持动画的一致性。
编辑:经过一番挖掘,没有必要使用完全跨度的项目来显示问题。我删除了全跨度。当我尝试将第 2 项移动到位置 0 时,它没有移动:第 1 项在它之后,第 3 项移动到右侧,所以我有:空单元格,第 2 项,新行,第 1 项,第 3 项。滚动后我的布局仍然正确。
更有趣的是我没有GridLayoutManager 的问题。我需要一个全跨度项目,所以它不是一个解决方案,但我想这确实是StaggeredGridLayoutManager 中的一个错误......
【问题讨论】:
-
我不知道这是否是一个错误,但我也看到过,只有当你滚动并选中
gap strategy时,事情似乎才会移动 -
@tyczj:
GAP_HANDLING_NONE避开了移动的物品,但我仍然得到了不正确的处置。GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS可能是默认值,无论如何,我使用它的行为与不指定任何内容的行为相同。 -
是的,我知道我只是说在您滚动适配器后检查间隙,然后将东西移动到正确的位置
标签: android android-recyclerview