我正在RecyclerView
与GridLayout
经理一起制作座位预订布局,例如旅行。
我的问题是当我的列是随机的时候如何自动检测spancount?
我知道spanCount = recyclerViewWidth / singleItemWidth;
,但问题是singleItemWidth
不同,因为座位宽度不同。
这是我想要的所需布局:
...但我现在得到的是这样的东西:
这是我用来安排座位布局的代码:
gridLayoutManager=new GridLayoutManager(this,totalRows, LinearLayoutManager.VERTICAL,
false);
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
int rows=Integer.parseInt(upperlist.get(position).get("row"));
return (rows);///(int) (mRecyclerView.getMeasuredWidth()/ 10);
}
});
mRecyclerView.setLayoutManager( gridLayoutManager);
MyAdapter myAdapter=new MyAdapter(this,gridArray);
...其中upperlist
包含这些值:
[{cols=8, seatNumber=29U, row=4, zindex=1},
{cols=6,seatNumber=23U, row=4, zindex=1},
{cols=4,seatNumber=21U,row=4, zindex=1},
{cols=2, seatNumber=11U, row=4, zindex=1},
{cols=0,seatNumber=9U,row=4, zindex=1},
{cols=8,seatNumber=25U, row=2, zindex=1},
{cols=6,seatNumber=17U, row=2, zindex=1},
{cols=4,seatNumber=13U, row=2, zindex=1},
{cols=2,seatNumber=5U, row=2, zindex=1},
{cols=10, seatNumber=D2U,row=2, zindex=1},
{cols=0, seatNumber=1U, row=2, zindex=1},
{cols=8, seatNumber=26U, row=1, zindex=1},
{cols=6,seatNumber=18U, row=1, zindex=1},
{cols=4,seatNumber=14U, row=1, zindex=1},
{cols=2,seatNumber=6U, row=1, zindex=1},
{cols=0,seatNumber=2U, row=1, zindex=1}]
这是一个单独的列表,我对行和列有不同的值。因此,我需要一种可以适用于所有布局的通用方法。
答案 0 :(得分:3)
我想" cols"参数定义项目应该放置的列,对吧? 如果是这种情况,您应该获取此参数的所有项目的最大值。 在这种情况下" 10"。由于所有项目似乎跨越2个cloumns,每个项目的跨度大小为2,最大跨度索引为11.因此,您的跨度计数应为12(从0到11不等)。
现在你必须找出空的空间。例如。第3行根本没有任何项目,根据您的数据,第1行和第1行4最后有一个空元素。因此,您应该定义一个空项( - > viewtype!),它代表布局中的空白区域。
最后,按行索引和列索引对项目列表进行排序,以便实现此结构:
[ //row 1
{cols=0, seatNumber=2U, row=1, zindex=1},
{cols=2, seatNumber=6U, row=1, zindex=1},
{cols=4, seatNumber=14U, row=1, zindex=1},
{cols=6, seatNumber=18U, row=1, zindex=1},
{cols=8, seatNumber=26U, row=1, zindex=1},
{cols=10, row=1, zindex=1}, //an empty element
//row 2
{cols=0, seatNumber=1U, row=2, zindex=1},
{cols=2, seatNumber=5U, row=2, zindex=1},
{cols=4, seatNumber=13U, row=2, zindex=1},
{cols=6, seatNumber=17U, row=2, zindex=1},
{cols=8, seatNumber=25U, row=2, zindex=1},
{cols=10, seatNumber=D2U,row=2, zindex=1},
//row 3 (just empty elements)
{cols=0, row=3, zindex=1},
{cols=2, row=3, zindex=1},
{cols=4, row=3, zindex=1},
{cols=6, row=3, zindex=1},
{cols=8, row=3, zindex=1},
{cols=10, row=3, zindex=1},
//row 4
{cols=0, seatNumber=9U, row=4, zindex=1},
{cols=2, seatNumber=11U, row=4, zindex=1},
{cols=4, seatNumber=21U, row=4, zindex=1},
{cols=6, seatNumber=23U, row=4, zindex=1},
{cols=8, seatNumber=29U, row=4, zindex=1},
{cols=10, row=4, zindex=1} //an empty element
]
以这种方式修改剩余的代码:
columnCount = computeTotalColumnCount(...); //
addEmptyElements(...); // add empty elements to your data structure (upperList or gridArray)
gridLayoutManager=new GridLayoutManager(this, columnCount, LinearLayoutManager.VERTICAL,
false);
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
return 2;
}
});
如果您希望每个项目的跨度大小更灵活,您应该为每个项目添加一个新参数,以便项目如下所示:
{cols=0, seatNumber=2U, row=1, zindex=1, spansize=2}
您可以将SpanSizeLookup修改为:
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
return Integer.parseInt(upperList.get(i).get("spansize"));
}
});
我希望这会有所帮助;)