【问题标题】:RecyclerView layoutmanager for changing row and column span用于更改行和列跨度的 RecyclerView 布局管理器
【发布时间】:2016-07-08 20:41:51
【问题描述】:

我正在寻找创建以下布局(红色方块不一定是正方形,自定义固定高度也可以)。布局看起来很简单,但我没有找到适合我需要的布局管理器。

我尝试了 StaggeredGridLayoutManager,但这只允许设置列或行的跨度,不能同时设置。

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

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

【问题讨论】:

标签: android android-layout grid android-recyclerview html-table


【解决方案1】:

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

我一直在寻找相同的方法,最后,经过 2 天的谷歌搜索,我找到了解决方案。非常感谢Nick Butcher!他的布局管理器SpannableGridLayoutManager 能够做到这一点。就我而言,我正在做一个像你的前两行一样的模式:

解决方法很简单:

1.下载 SpannableGridLayoutManagerfrom here

由于某种原因,我不得不更改这一行:

while (availableSpace > 0 && lastVisiblePosition < lastItemPosition) {

while (lastVisiblePosition < lastItemPosition) {

让经理工作。

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
    );

这正是我想要的(数字是适配器中项目的位置):

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

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

【讨论】:

  • 我正在尝试您的答案,但是第 54 行出现错误 TypedArray a = context.obtainStyledAttributes( attrs, R.styleable.SpannedGridLayoutManager, defStyleAttr, defStyleRes); - //R.styleable.SpannedGridLayoutManager is not found
  • @SNos 看到编辑。你必须为你的经理声明一种风格
  • @kristyna 当我在 recyclerview 中添加 7 个图像并且滚动后 6 个数字位置图像仅显示一半,当我在列表中添加 1 个图像然后滚动它运行良好。它是如何解决的?你能帮帮我吗?
  • @kristyna 你有这方面的例子吗?请帮忙
  • 我已经设法解决了我们特定案例的问题。问题在于 scrollVerticallyBy(), else 子句。 LayoutManager 将采用最后一项。如果上一个项目的跨度大于上一个项目,即 2x2 与 1x1,则列表不会滚动,因为“底部”值来自较小的项目。我已经硬编码,如果前一项是大项,则从该项中获取“底部”值。然而,这不是一个通用的解决方案。希望这会对某人有所帮助。
【解决方案2】:

终于做到了,它将帮助所有试图实现任何模式的人

我一直在寻找相同的结果,但只有一个 header 和延迟加载 footer。 我也尝试了 Nick Butcher Library@Kristyna 答案。但它有很多问题,例如extra space or fixed cell height 问题快速滚动视图消失问题

我找到了另一个 Arathel 库SpannedGridLayoutManager 并尝试实现它。但它也有许多问题,例如 fixed heightfooters extra space 问题

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

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

就我而言

  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

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

【讨论】:

  • @WebDiva 如果你的项目是 JAVA,你可以在任何地方使用这个类。
  • 它抛出 'java.lang.ArithmeticException: 在 com.arasthel.spannedgridlayoutmanager.SpannedGridLayoutManager.fillAfter(SpannedGridLayoutManager.kt:623) 处除以零
  • @WebDiva 您使用的是哪个分支?试试 custom-layoutparams 分支
  • @WebDiva 抱歉? 没有自定义布局参数,请使用 dev 或 dynamic_layout。
  • 对不起,我使用的是默认实现。我现在已经把它改成了你的。让我们看看它现在是否有效。
猜你喜欢
  • 2021-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
  • 2016-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多