RecyclerView使用GridLayoutManager布局筐骇,默認(rèn)情況下布局會(huì)如下圖所示:
通常這不是我們想要的效果债鸡,一般我們會(huì)選擇把最右側(cè)的空間去掉,然后布局間隔均分剩余空間铛纬,如下圖:
想要達(dá)到上圖的效果厌均,方法不止一種,比較直觀的一種方法是把除第一個(gè)以外的其他布局向右移動(dòng)一定距離來實(shí)現(xiàn)告唆。
理論上是最后測(cè)空間均分后分別填充到剩余縫隙去棺弊,代碼實(shí)際操作需要對(duì)每一個(gè)條目的left進(jìn)行設(shè)置晶密。假設(shè)最右側(cè)空間均分后每一份的距離為s,每一項(xiàng)需要移動(dòng)的距離是前一項(xiàng)的移動(dòng)距離再加上s镊屎。
,所以代碼可以這樣寫
首先求出剩余空間茄螃,RecyclerView的寬度減去每一個(gè)條目的寬度缝驳,然后使用剩余寬度和條目個(gè)數(shù)自定義修飾類SpaceItemDecoration,類里可以對(duì)每一個(gè)條目自定義left值归苍。
部分代碼如下:
{
final int column = 3;
GridLayoutManager manager = new GridLayoutManager(getContext(), column);
guessRecyclerView.setLayoutManager(manager);
// 減掉RecyclerView父布局兩側(cè)padding和item的寬度用狱,然后平分,默認(rèn)每個(gè)item右側(cè)會(huì)填充剩余空間
int spaceWidth = (LuckyContext.screenInfo.width -
(int) (getResources().getDimension(R.dimen.dd_dimen_20px) * 2) -
(int) (getResources().getDimension(R.dimen.dd_dimen_210px) * column)) / (column * (column - 1));
guessRecyclerView.addItemDecoration(new SpaceItemDecoration(spaceWidth, column));
}
// 自定義條目修飾類
public class SpaceItemDecoration extends RecyclerView.ItemDecoration {
private final int column;
private final int space;
public SpaceItemDecoration(int space, int column) {
this.space = space;
this.column = column;
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
// 第一列左邊貼邊拼弃、后邊列項(xiàng)依次移動(dòng)一個(gè)space和前一項(xiàng)移動(dòng)的距離之和
int mod = parent.getChildAdapterPosition(view) % column;
outRect.left = space * mod;
}
}
后記:
其實(shí)還有一種較為方便的方法夏伊,通常手機(jī)常見的寬度有320dp、360dp幾種吻氧,如果我們適配使用的是dp這種方式溺忧,那么不兼容的情況可能就是寬度的并不是上述幾種,比如我的小米8的寬度就是392dp盯孙,這種情況可以單獨(dú)新建layout-w392dp鲁森、或者value-w392dp在其中對(duì)長(zhǎng)度進(jìn)行單獨(dú)設(shè)值。不過小米8可以手動(dòng)修改寬度的dp值振惰,如果是用戶手動(dòng)修改了寬度值歌溉,那這么做可能就沒有效果了(⊙﹏⊙)!骑晶!