RecyclerView layoutmanager用于更改行和列范围

时间:2016-07-08 20:41:52

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

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

wat i want

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

是否有自定义布局管理器可以执行此操作? 我看过TwoWayView但是改变高度似乎有问题而且库没有被维护。

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

2 个答案:

答案 0 :(得分:8)

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

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

enter image description here

解决方案很简单:

<强> 1。下载SpannableGridLayoutManager from 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
    );

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

enter image description here

编辑:有问题的错误 将这些行放入attrs.xml

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

答案 1 :(得分:1)

最终做到了,它将为所有尝试实现任何模式的人提供帮助

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

我找到了Arasthel SpannedGridLayoutManager的另一个库,并尝试实现它。但是它也有很多问题,例如固定高度页脚多余空间问题

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

我最终编辑的分叉库下载从此处SpannedGridLayoutManager

enter image description here

就我而言

  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 逻辑可能会根据要求而有所不同,对我来说,我出于测试目的已对其进行了随机设置。