RecyclerView使用GridLayoutManager布局,默認情況下布局會如下圖所示:
image.png
通常這不是我們想要的效果,一般我們會選擇把最右側的空間去掉,然后布局間隔均分剩余空間,如下圖:
image.png
想要達到上圖的效果,方法不止一種,比較直觀的一種方法是把除第一個以外的其他布局向右移動一定距離來實現。
image.png
理論上是最后測空間均分后分別填充到剩余縫隙去,代碼實際操作需要對每一個條目的left進行設置。假設最右側空間均分后每一份的距離為s,每一項需要移動的距離是前一項的移動距離再加上s。
,所以代碼可以這樣寫
首先求出剩余空間,RecyclerView的寬度減去每一個條目的寬度,然后使用剩余寬度和條目個數自定義修飾類SpaceItemDecoration,類里可以對每一個條目自定義left值。
部分代碼如下:
{
final int column = 3;
GridLayoutManager manager = new GridLayoutManager(getContext(), column);
guessRecyclerView.setLayoutManager(manager);
// 減掉RecyclerView父布局兩側padding和item的寬度,然后平分,默認每個item右側會填充剩余空間
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) {
// 第一列左邊貼邊、后邊列項依次移動一個space和前一項移動的距離之和
int mod = parent.getChildAdapterPosition(view) % column;
outRect.left = space * mod;
}
}
后記:
其實還有一種較為方便的方法,通常手機常見的寬度有320dp、360dp幾種,如果我們適配使用的是dp這種方式,那么不兼容的情況可能就是寬度的并不是上述幾種,比如我的小米8的寬度就是392dp,這種情況可以單獨新建layout-w392dp、或者value-w392dp在其中對長度進行單獨設值。不過小米8可以手動修改寬度的dp值,如果是用戶手動修改了寬度值,那這么做可能就沒有效果了(⊙﹏⊙)??!