我希望创建以下布局(红色sqaures不一定是正方形,自定义固定高度也很好)。布局似乎很简单,但我找不到适合我需要的布局管理器。
我尝试过StaggeredGridLayoutManager,但这只允许设置列或行的跨度,而不是两者。
是否有自定义布局管理器可以执行此操作? 我看过TwoWayView但是改变高度似乎有问题而且库没有被维护。
有人遇到这个问题并解决了吗?
答案 0 :(得分:8)
有点晚了,但它可能对其他人有帮助......
我一直在寻找同样的东西,最后,经过2天的谷歌搜索,我找到了解决方案。非常感谢Nick Butcher!他的布局经理SpannableGridLayoutManager
能够做到这一点。就我而言,我正在做一个像前两行一样的模式:
解决方案很简单:
<强> 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
);
这给了我我想要的东西(数字是适配器中项目的位置):
编辑:有问题的错误
将这些行放入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。
就我而言
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 逻辑可能会根据要求而有所不同,对我来说,我出于测试目的已对其进行了随机设置。