最近用到了 需要九宮格的上下左右都有分割 於是上網找了好幾個 有一個用着還不錯 自己改了一下 在此記錄
這個方法我嘗試了三四次 剛開始 總是有問題 不是第一列間距小了 就是沒有間距了 然後又換方法 最後又換了回來 發現是我的adapter裏面的item 寬度設置有問題 因爲使用的是GridLayoutManager 他是根據設置列數 然後等分的 我開始把item的寬度寫死xxdp了 然後就出現某一列的間距有問題 這裏面item的寬度要設置成match_parent 就可以了
全部代碼 getItemOffsets裏面的代碼可以根據需求動態修改
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
/**
* Created by admin on 2019/10/9.
*/
public class MyItemDecoration extends RecyclerView.ItemDecoration {
private int space;
private int color;
private Paint mPaint;
/**
* 默認的,垂直方向 橫縱1px 的分割線 顏色透明
*/
public MyItemDecoration() {
this(1);
}
/**
* 自定義寬度的透明分割線
*
* @param space 指定寬度
*/
public MyItemDecoration(int space) {
this(space, Color.TRANSPARENT);
}
/**
* 自定義寬度,並指定顏色的分割線
*
* @param space 指定寬度
* @param color 指定顏色
*/
public MyItemDecoration(int space, int color) {
this.space = space;
this.color = color;
initPaint();
}
private void initPaint() {
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setColor(color);
mPaint.setStyle(Paint.Style.FILL);
mPaint.setStrokeWidth(space);
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
GridLayoutManager manager = (GridLayoutManager) parent.getLayoutManager();
int childSize = parent.getChildCount();
int span = manager.getSpanCount();
//爲了Item大小均勻,將設定分割線平均分給左右兩邊Item各一半
int offset = space / 2;
//得到View的位置
int childPosition = parent.getChildAdapterPosition(view);
//第一排,頂部
if (childPosition < span) {
//最左邊的
if (childPosition % span == 0) {
outRect.set(space, space, offset, 0);
//最右邊的
} else if (childPosition % span == span - 1) {
outRect.set(offset, space, space, 0);
//中間的
} else {
outRect.set(offset, space, offset, 0);
}
} else {
//上下的分割線,就從第二排開始
//最左邊的
if (childPosition % span == 0) {
outRect.set(space, space, offset, 0);
//最右邊的
} else if (childPosition % span == span - 1) {
outRect.set(offset, space, space, 0);
//中間的
} else {
outRect.set(offset, space, offset, 0);
}
}
}
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
super.onDraw(c, parent, state);
}
}