下面结论都是基于GridLayoutManager方向为竖直,spanCount为列数的情况,但在水平方向类似。
SpanSizeLookup
-
public int getSpanIndex(int position, int spanCount)
返回值:position对应item所在列的起始index -
public abstract int getSpanSize(int position)
返回值:position对应item所跨越列的数量(所占spanCount的份额) -
public int getSpanGroupIndex(int adapterPosition, int spanCount)
返回值:position对应item所属组的index, 如果是竖直方向就表示所在的行号
假设一个grid为5列,有一个item在第二行,宽度从第二列开始到最后一列。
那么那么这个item宽度占了4列,所以getSpanSize等于4。
在第二行,所以getSpanGroupIndex等于1。
宽度从第二列开始,所以getSpanIndex等于1。
ItemDecoration
在使用decoration做间距,getItemOffsets方法中使用Rect为每个item分配间距,如果每个item的左右间距之和不相等,则会导致最终每个item不是均分。
假设左间距a,右间距b,每个item之间的间隔为c,对任意个数均分左右间距应该满足下面关系,记左间距为L0,L1,L2....Ln-1,右间距为R0,R1,R2....Rn-1,n为每行item个数。
常数k= (a+b+(n-1)*c)/n
第一个: L0 = a, R0= k-L0
第二个:L1 = k-R0, R1 = k-L1
......
第N个:L(n-1) = k - R(n-2), R(n-1) = b
上面关系可以通过整理个算法计算
网友评论