垂直 GridLayoutManager 中的动态子宽度
dynamic child width in vertical GridLayoutManager
我有一个 table 要显示在 RecyclerView 中。目前我正在使用垂直方向的 GridLayoutManager。由于我的所有逻辑都取决于 GridLayoutManager 的垂直方向,因此我无法切换到水平方向或 StaggeredLayoutManager。有没有办法改变 RecyclerView children measure 以便每行的第一个单元格可以有不同的宽度?
我建议你使用SpanSizeLookup。
像这样:
GridLayoutManager manager = new GridLayoutManager(context, 2);
manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
switch(adapter.getItemViewType(position)) {
// first cell type
case 1:
return 1;
default:
return 2;
}
}
});
并且在您的适配器中,您应该覆盖 getItemViewType
和 return 不同类型的单元格。
经过一些资源挖掘,我发现方法 GridLayoutManager.calculateItemBorders() 负责项目宽度 (cachedBorder)。但是由于更改该方法是私有的,我们不能覆盖它。
希望这对面临类似情况的任何人有所帮助。
我有一个 table 要显示在 RecyclerView 中。目前我正在使用垂直方向的 GridLayoutManager。由于我的所有逻辑都取决于 GridLayoutManager 的垂直方向,因此我无法切换到水平方向或 StaggeredLayoutManager。有没有办法改变 RecyclerView children measure 以便每行的第一个单元格可以有不同的宽度?
我建议你使用SpanSizeLookup。
像这样:
GridLayoutManager manager = new GridLayoutManager(context, 2);
manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
switch(adapter.getItemViewType(position)) {
// first cell type
case 1:
return 1;
default:
return 2;
}
}
});
并且在您的适配器中,您应该覆盖 getItemViewType
和 return 不同类型的单元格。
经过一些资源挖掘,我发现方法 GridLayoutManager.calculateItemBorders() 负责项目宽度 (cachedBorder)。但是由于更改该方法是私有的,我们不能覆盖它。
希望这对面临类似情况的任何人有所帮助。