RecyclerView的GridLayoutManager动态跨度计数

14
我正在使用以下代码动态更改span计数。
val layoutManager = GridLayoutManager(this, 3)
layoutManager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
    override fun getSpanSize(position: Int): Int {
        when (position) {
            0, 1, 2 -> return 1
            3, 4 -> return 2
            5 -> return 3
            else -> return 1
        }
    }
}

以下是我的输出结果。 但我希望D和E水平对齐。我不知道如何做到。

实际上,适配器中有3种类型,HEADER,TYPE_A,TYPE_BHEADER应该只有一行,TYPE_A有3行,TYPE_B有2行。

因此,我需要帮助使某些列仅具有1行,某些列仅具有2行(水平对齐),某些列具有3行。

输入图像描述

3个回答

27

在这种情况下,您应该让您的网格布局具有超过3个单元格。您需要选择一个适用于所有三种类型单元格的数字,6是一个不错的选择,因为如果每行有3个单元格,您将返回2。如果每行有2个单元格,您将返回3,如果每行只有1个单元格,则返回6:

val layoutManager = GridLayoutManager(this, 6)
layoutManager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
    override fun getSpanSize(position: Int): Int {
        when (position) {
            0, 1, 2 -> return 2
            3, 4 -> return 3
            5 -> return 6
            else -> return 2
        }
    }
}

嘿,如果我想在第一行显示三个项目,但在第二行只显示两个项目,由于我们无法将spansize设置为1.5,因为它只允许INT,那么最好的方法是什么? 所以我想在顶部行中有3个项目,在底部行中有2个项目,等间距分布。 - coding.cat3
@coding.cat3,你有找到解决方案吗?如果有,请发表你的解决方案。我也在寻找同样的问题的解决方法。 - Zubair Akber

1

以下是我的动态跨度解决方案,其中最大跨度为4,12是4、3和2的倍数。 //您需要的跨度数量就是您的数组大小

val mutipleSpan = 12  //least common multiple
val maxSpan = 4//max span count 
val mLayoutManager = object : GridLayoutManager(itemView.context, mutipleSpan){}

mLayoutManager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
            override fun getSpanSize(position: Int): Int {
                val actualSize =  //NUMBER OF THE SPAN THAT YOU WANT
                if(actualSize< maxSpan){
                    return  mutipleSpan/actualSize
                }
                return mutipleSpan/maxSpan
            }
        }

recycler.layoutManager = mLayoutManager 

0

使用Google的库中的FlexBoxLayoutManager

文档描述了这是一个有效的解决方案。

enter image description here


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