首先按行填充GridLayoutManager,然后按列填充。

10

当我用GridLayoutManager填充一个recycler view时,我遇到了一些问题。

我需要先填满第一行,然后再去填第二行。我写了一个算法来重新排序列表,以便正确显示并且无需进行任何映射-解除映射的操作就能获取单击项目。这个算法运作良好,但是当所有项都可以在屏幕上显示而不需要滚动时,问题就出现了。

例如,我有4个项目,需要在2行网格布局(水平布局)中显示它们。屏幕有3个项目的空间,所以我需要它们在第一行,而第4个项目应该是第二行的唯一一个。

为了让你更好地理解默认情况下我的情况:

0 2
1 3 

我需要的是:

0 1 2
3

有什么想法吗?

编辑: 根据要求,这是我正在使用的代码:

    GridLayoutManager layoutManager = new GridLayoutManager(getContext(),2,LinearLayoutManager.HORIZONTAL, false);

4
你找到解决办法了吗? - Ozan
2个回答

0

当你定义GridLayoutManager时,需要指定列数。

RecyclerView rView = new RecyclerView(this);
rView.setLayoutManager(new GridLayoutManager(context, <your number of columns>));

将此值设置为3(在您的情况下)将导致三列,两行。您的数组适配器从左到右,从上到下填充字段。


如果失败了,您可以将“null”或“ ”添加到数组中,直到它被您想要的列数(在此示例中为6个元素)均匀地整除。这将在第二行中填充两列空白,但仍将它们添加到布局中。 - keag
1
第一种方法是我尝试过但没有成功的。默认情况下,它不会像你提到的那样显示项目(请查看问题中它如何对项目进行排序)。第二种方法不应该起作用!我最终重新排序整个列表以匹配预期结果,但没有明确的解决方案来解决这个问题。无论如何,还是谢谢! - Juan Giorello
你是如何声明你的gridLayoutManager的?能否更新你的回答并附上一些现有的代码? - keag
已更新。请记住我需要一个水平网格! - Juan Giorello

0

不确定这是否能解决您的问题,但是您可以根据项目类型或位置(或类似逻辑)拥有动态列。

val layoutManager = GridLayoutManager(requireContext(), columnsCount)
layoutManager.spanSizeLookup = object: GridLayoutManager.SpanSizeLookup() {
    override fun getSpanSize(position: Int): Int {
        return adapter.getColumnsCount(position)
    }
}
rvList.layoutManager = layoutManager

在你的适配器中编写一个返回列的方法。
fun getColumnsCount(position: Int): Int {
    return when (getItem(position).type) {
        ItemType.FIRST -> 1
        ItemType.SECOND -> 3
    }
}

====== 如果您只需要将项目适配到屏幕上,您可以使用固定宽度的项目,并计算屏幕上可以容纳多少个项目:

val columnCount = recyclerView.width / resources.getDimensionPixelSize(R.dimen.grid_item_width)

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