RecyclerView添加分割線
線性布局
public class CommonDecoration extends RecyclerView.ItemDecoration {
//清單的方向:LinearLayoutManager.VERTICAL或LinearLayoutManager.HORIZONTAL
private int mOrientation;
private int padding;
/**
* 預設分割線:高度為2px,顔色為灰色
*
* @param context
* @param orientation 清單方向
*/
public CommonDecoration(Context context, int orientation, int dp) {
if (orientation != LinearLayoutManager.VERTICAL && orientation != LinearLayoutManager.HORIZONTAL) {
throw new IllegalArgumentException("請輸入正确的參數!");
}
mOrientation = orientation;
padding = DensityUtils.dp2px(dp);
}
@Override
public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
int itemCount = parent.getAdapter().getItemCount();
int childAdapterPosition = parent.getChildAdapterPosition(view);
if (mOrientation == LinearLayoutManager.HORIZONTAL) {
if (childAdapterPosition < itemCount - 1) {
outRect.set(0, 0, padding, 0);
} else {
outRect.set(0, 0, 0, 0);
}
} else {
if (childAdapterPosition < itemCount - 1) {
outRect.set(0, 0, 0, padding);
} else {
outRect.set(0, 0, 0, 0);
}
}
}
}
網格布局
public class GridDecoration extends RecyclerView.ItemDecoration {
private int horizontalPadding;
public int verticalPadding;
public GridDecoration(int horizontalPadding, int verticalPadding) {
this.horizontalPadding = DensityUtils.dp2px(horizontalPadding);
this.verticalPadding = DensityUtils.dp2px(verticalPadding);
}
@Override
public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
if (layoutManager instanceof GridLayoutManager) {
GridLayoutManager gridLayoutManager = (GridLayoutManager) layoutManager;
int spanCount = gridLayoutManager.getSpanCount();
int childAdapterPosition = parent.getChildAdapterPosition(view);
int column = childAdapterPosition % spanCount;
int itemCount = parent.getAdapter().getItemCount();
outRect.left = column * horizontalPadding / spanCount;
outRect.right = horizontalPadding - (column + 1) * horizontalPadding / spanCount;
//數學思想
int raw = (itemCount-1) / spanCount;
int currentRaw = childAdapterPosition / spanCount;
if (raw != currentRaw) {
outRect.bottom = verticalPadding;
}else{
outRect.bottom = 0;
}
}
}
}