TwoWayView搭配SpannableGridLayoutManager无法修改高度求助
解决TwoWayView + SpannableGridLayoutManager 视图高度无法设为宽度1/2的问题
嘿,我之前也踩过这个坑!SpannableGridLayoutManager默认会强制每个item保持正方形,因为它的默认SpanSizeLookup会把每个item的高度跨度设为1.0,和宽度跨度完全一致,所以你直接改XML布局或者设置普通LayoutParams根本没用。
要实现高度是宽度的1/2,核心是自定义SpanSizeLookup并重写getSpanHeight方法,让布局管理器明确知道每个item的高度占比应该是多少。
具体解决方案
在你初始化SpannableGridLayoutManager之后,添加这段自定义的SpanSizeLookup逻辑:
int columnNumber = 3; int rowNumber = 6; final SpannableGridLayoutManager layoutManager = new SpannableGridLayoutManager(TwoWayLayoutManager.Orientation.VERTICAL, columnNumber, rowNumber); // 关键代码:自定义SpanSizeLookup控制高度比例 layoutManager.setSpanSizeLookup(new SpannableGridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { // 保持每个item占1列,和你原来的列数设置一致 return 1; } @Override public float getSpanHeight(int position) { // 返回0.5,让高度等于宽度的1/2 // 原理:默认行高和列宽相等,0.5倍的行高就是1/2的列宽(即item的宽度) return 0.5f; } }); mTwoWayView.setLayoutManager(layoutManager);
为什么这样有效?
SpannableGridLayoutManager的布局逻辑完全依赖SpanSizeLookup来确定每个item的尺寸:
getSpanSize控制item宽度占几列(这里保持1列,和你原本的设置匹配)getSpanHeight控制item高度占几行(支持浮点数!默认返回1.0,所以是正方形,改成0.5就实现了宽高1:2的比例)
额外注意事项
- 确保你的item布局XML里,不要给根视图设置固定高度,改成
wrap_content或者直接去掉高度属性,让布局管理器来接管高度计算。 - 如果需要给不同位置的item设置不同比例,只需要在
getSpanHeight里根据position返回对应的值即可(比如某些item保持正方形返回1.0,某些返回0.5)。
内容的提问来源于stack exchange,提问作者Florian Mac Langlade
相关产品推荐
相关产品推荐

