Android 用于更改行和列跨度的RecyclerView layoutmanager

Android 用于更改行和列跨度的RecyclerView layoutmanager,android,android-layout,grid,android-recyclerview,html-table,Android,Android Layout,Grid,Android Recyclerview,Html Table,我希望创建以下布局(红色方形不一定非得是正方形,自定义固定高度也可以)。布局似乎很简单,但我没有找到一个布局经理,适合我的需要 我尝试了StaggedGridLayoutManager,但这只允许设置列或行的范围,不能同时设置两个 是否有一个自定义布局管理器可以实现这一点? 我看过TwoWayView,但改变高度似乎有问题,图书馆也没有得到维护 有人遇到这个问题并解决了吗?有点晚了,但它可能会帮助其他人 我也在寻找同样的答案,经过两天的谷歌搜索,我终于找到了解决办法。非常感谢!他的名为Span

我希望创建以下布局(红色方形不一定非得是正方形,自定义固定高度也可以)。布局似乎很简单,但我没有找到一个布局经理,适合我的需要

我尝试了StaggedGridLayoutManager,但这只允许设置列或行的范围,不能同时设置两个

是否有一个自定义布局管理器可以实现这一点? 我看过TwoWayView,但改变高度似乎有问题,图书馆也没有得到维护


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

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

我也在寻找同样的答案,经过两天的谷歌搜索,我终于找到了解决办法。非常感谢!他的名为
SpannableGridLayoutManager
的布局管理器能够做到这一点。在我的例子中,我正在做一个类似于前两行的模式:

解决方案很简单:

1。下载SpannableGridLayoutManager

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

while (availableSpace > 0 && lastVisiblePosition < lastItemPosition) {
这正是我想要的(数字是项目在适配器中的位置):

编辑:可设置样式的错误 将这些行放入
attrs.xml

<declare-styleable name="SpannedGridLayoutManager">
    <attr name="android:orientation" />
    <attr name="spanCount" />
    <attr name="aspectRatio" format="string" />
</declare-styleable>

最终,它将帮助所有试图实现任何类型模式的人

我一直在寻找相同的结果,但是有一个页眉和延迟加载页脚。 我也试过克里斯蒂娜的答案。但它也有很多问题,比如快速滚动视图消失问题

我找到了另一个Arasthel库并试图实现它。但它也有很多问题,如固定高度和页脚额外空间的问题

最后,在挖掘了5小时Arasthel的SpandGridLayoutManager后,我解决了问题并找到了结果

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

就我而言

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


spanSizeLookup逻辑可能会根据要求而有所不同,对于我来说,我是随机设置的,用于测试目的。

检查此项:@Brianvdb是否已解决此问题?如果是,您能帮我摆脱此问题吗?这将非常有帮助,谢谢…不过我正在尝试您的答案,第54行
TypedArray a=context.ActainStyledAttributes(attrs,R.styleable.SpandGridLayoutManager,defStyleAttr,defStyleRes)上有错误-
//R.styleable.SpandGridLayoutManager
不可用found@SNos请参见编辑。您必须为您的应用程序声明一种样式manager@kristyna当我在recyclerview和scroll中添加7个图像后,6个数字位置图像仅显示一半,当我在列表中添加1个图像后,scroll工作正常。它是如何解决的?你能帮我吗?@kristyna你有这样的例子吗?请帮帮忙,我已经设法解决了我们这个特殊案例的问题。问题出在scrollVerticallyBy(),else子句中。LayoutManager将接受最后一项。如果上一个项目的跨度大于上一个项目,即2x2 vs 1x1,则列表不会滚动,因为“底部”值来自较小的项目。我已经硬编码,如果前面的项目是大的,那么从那个项目中取“底部”值。然而,这不是一个普遍的解决办法。希望这会对其他人有所帮助。你能提供java代码吗?@WebDiva如果你的项目是java的,你可以在任何地方使用这个类。它会抛出'java.lang.arasthel.SpandGridLayoutManager.SpandGridLayoutManager.fillAfter(SpandGridLayoutManager.kt:623)@WebDiva你在使用哪个分支?尝试自定义布局参数branch@WebDiva很抱歉
<declare-styleable name="SpannedGridLayoutManager">
    <attr name="android:orientation" />
    <attr name="spanCount" />
    <attr name="aspectRatio" format="string" />
</declare-styleable>
  val adapter = GridItemAdapter()//This is your adapter
  val spannedGridLayoutManager = SpannedGridLayoutManager(orientation = VERTICAL, spans = 3)
  spannedGridLayoutManager.itemOrderIsStable = true
  recyclerview.layoutManager = spannedGridLayoutManager
  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