RecyclerView - 如何使GridLayoutManager强制将某些项放在下一行

5

我使用GridLayoutManager在RecyclerView中垂直放置项目。每个项目占用一个span。

现在我想让一些项目结束当前行,以便下一个项目放置在其下方的新行中。每个项目都必须只能占用一个span,以便它们的宽度相同。

示例:

enter image description here

项目[4]将被放置在下一行,而不是在项目[3]之后。项目[3]之后的空间应保留未使用。
我尝试使用SpanSizeLookup,但它的对我来说没有任何意义,任何值似乎都没有任何作用。
有人能提供解决方案吗?

你覆盖了getItemViewType吗? - matrix
setSpanSizeLookup 正常工作 - Pavya
我的意思是,您可以拥有一个包含2个值{ONE_BOX,THREE_BOX}的枚举,然后在这两种情况下创建viewHolder,但您将需要2个布局。我的意思是,我认为您无法真正通过1个布局实现您想要的,并且实际上“强制”管理器决定何时将项目放到另一行。 - matrix
当你只需要一些放置逻辑时,使用不同的项类型并不是解决方案。在RecyclerView中,您可以动态地插入/删除项目,然后项目会动画到其新位置,如果我强制某个项目占用3个跨度,那么所有内容都会被破坏。此外,我已经有了大约20种项目类型,无法为2或3个跨度创建不同的布局版本。 - Pointer Null
@PointerNull 你找到解决方案了吗? - andreich
显示剩余2条评论
1个回答

1
GridLayoutManager manager = new GridLayoutManager(getContext(), 3, LinearLayoutManager.VERTICAL, false);
    manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
        @Override
        public int getSpanSize(int position) {
            return position == 3 ? 3 : 1;
        }
});

每个元素的默认跨度大小为1,只需在自定义跨度查找中返回所需的跨度大小。

1
谢谢,我知道这个选项,但是这样项目的布局宽度会被拉伸以适应3个项目的宽度。我希望该项目仅占用单个跨度的宽度。 - Pointer Null
请提供一个示例,让我可以看到您使用此解决方案时遇到的实际问题(动画问题等)。 - artkoenig
我们可以根据其位置将项目放置在新行上吗?我们可以考虑项目的属性,例如它的类别吗? - QuarK
这不是一个有用的答案,因为除了使跨越多列的项目后面的项目之外,它还会错误地拉伸跨越多列的项目,在这种情况下特别不需要。 - David Rector

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接