RecyclerView layoutmanager用于更改行和列跨度

Bri*_*vdb 8 grid android html-table android-layout android-recyclerview

我希望创建以下布局(红色sqaures不一定是正方形,自定义固定高度也很好).布局似乎很简单,但我找不到适合我需要的布局管理器.

我想要的

我尝试了StaggeredGridLayoutManager,但这只允许设置列或行的跨度,而不是两者.

在自定义布局管理器周围是否有浮动能够执行此操作?我看过TwoWayView但是改变高度似乎有问题而且库没有被维护.

有人遇到这个问题并解决了吗?

kri*_*yna 15

有点晚了,但它可能会帮助其他人......

我正在寻找同样的东西,最后,经过2天的谷歌搜索,我找到了解决方案.非常感谢Nick Butcher!他的布局管理员SpannableGridLayoutManager有能力做到这一点.在我的情况下,我正在做一个类似前两行的模式:

在此输入图像描述

解决方案很简单:

1. 从这里下载SpannableGridLayoutManager

出于某种原因,我不得不改变这一行:

while (availableSpace > 0 && lastVisiblePosition < lastItemPosition) {
Run Code Online (Sandbox Code Playgroud)

while (lastVisiblePosition < lastItemPosition) {
Run Code Online (Sandbox Code Playgroud)

让经理工作.

2.将SpannableGridLayoutManger设置为RecyclerView

就我而言:

    SpannedGridLayoutManager manager = new SpannedGridLayoutManager(
            new SpannedGridLayoutManager.GridSpanLookup() {
                @Override
                public SpannedGridLayoutManager.SpanInfo getSpanInfo(int position) {
                    // Conditions for 2x2 items 
                    if (position % 6 == 0 || position % 6 == 4) {
                        return new SpannedGridLayoutManager.SpanInfo(2, 2);
                    } else {
                        return new SpannedGridLayoutManager.SpanInfo(1, 1);
                    }
                }
            },
            3, // number of columns
            1f // how big is default item
    );
Run Code Online (Sandbox Code Playgroud)

这给了我我想要的东西(数字是适配器中项目的位置):

在此输入图像描述

编辑:带有样式的错误 将这些行放入attrs.xml

<declare-styleable name="SpannedGridLayoutManager">
    <attr name="android:orientation" />
    <attr name="spanCount" />
    <attr name="aspectRatio" format="string" />
</declare-styleable>
Run Code Online (Sandbox Code Playgroud)

  • 我已经设法解决了我们的特殊情况。问题在于scrollVerticallyBy(),else子句。LayoutManager将采用最后一项。如果倒数第二个项目的范围比最后一个项目大,即2x2对1x1,则列表将不会滚动,因为“底部”值来自较小的项目。我已经硬编码过,如果上一个项目是大项目,则取该项目的“最低”价值。但是,这不是一般的解决方案。希望这会帮助某人。 (2认同)

Nab*_*bin 6

终于做到了,它将帮助每个试图实现任何类型模式的人

我正在寻找相同的结果,但只有一个header和延迟加载footer。我也尝试了尼克·布彻图书馆的@Kristyna答案。但它有很多问题,例如快速滚动视图消失问题、额外空间问题或固定单元格高度问题

我找到了 Arasthel SpannedGridLayoutManager的另一个库并尝试实现它。但它也存在许多问题,例如固定高度页脚额外空间问题

最后,经过 5 小时的挖掘 Arasthel 的 SpannedGridLayoutManager 后,我修复了问题并找到了结果。

我最终编辑的分叉库从这里下载SpannedGridLayoutManager

在此输入图像描述

就我而言

  val adapter = GridItemAdapter()//This is your adapter
  val spannedGridLayoutManager = SpannedGridLayoutManager(orientation = VERTICAL, spans = 3)
  spannedGridLayoutManager.itemOrderIsStable = true
  recyclerview.layoutManager = spannedGridLayoutManager
Run Code Online (Sandbox Code Playgroud)

  spannedGridLayoutManager.spanSizeLookup = SpannedGridLayoutManager.SpanSizeLookup { position ->
        when {
            position == 0 -> {
                /**
                 * 150f is now static 
                 * should calculate programmatically in runtime
                 * for to manage header hight for different resolution devices
                 */
                SpanSize(3, 1, 150f)
            }
            position % 7 == 1 ->
                SpanSize(2, 2)
            else ->
                SpanSize(1, 1)
        }
    }
  recyclerview.adapter = adapter
Run Code Online (Sandbox Code Playgroud)

这个spanSizeLookup逻辑可能会根据需求而变化,对我来说,我出于测试目的随机设置了它。