public class BaseMultiItemDecorationextends RecyclerView.ItemDecoration {
private int mRowSpace, mColumnSpace;
@Override
public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
int position = parent.getChildAdapterPosition(view);
if (parent.getAdapter() !=null) {
RecyclerView.Adapter parentAdapter = parent.getAdapter();
int type = parentAdapter.getItemViewType(position);
RecyclerView.LayoutManager manager = parent.getLayoutManager();
if (managerinstanceof GridLayoutManager) {
GridLayoutManager gridLayoutManager = (GridLayoutManager) manager;
int count = parentAdapter.getItemCount();
int spanCount = gridLayoutManager.getSpanCount();
if (LinearLayoutManager.VERTICAL == gridLayoutManager.getOrientation()) {
if (spanCount ==1) {
getLinearVerticalOffsets(outRect, parent, type, position);
}else {
getGridVerticalOffsets(gridLayoutManager,outRect, parent, type, position, spanCount, count);
}
}else if (LinearLayoutManager.HORIZONTAL == gridLayoutManager.getOrientation()) {
if (spanCount ==1) {
getLinearHorizontalOffsets(outRect, parent, type, position);
}else {
getGridHorizontalOffsets(gridLayoutManager,outRect, parent, type, position, spanCount, count);
}
}
}else if (managerinstanceof LinearLayoutManager) {
LinearLayoutManager linearLayoutManager = (LinearLayoutManager) manager;
if (LinearLayoutManager.VERTICAL == linearLayoutManager.getOrientation()) {
getLinearVerticalOffsets(outRect, parent, type, position);
}else {
getLinearHorizontalOffsets(outRect, parent, type, position);
}
}
}
}
private void getLinearHorizontalOffsets(@NonNull Rect outRect, @NonNull RecyclerView parent, int type, int position) {
if (position ==0) {
outRect.left =mColumnSpace;
}
if (type <0) {
return;
}
outRect.bottom =mRowSpace;
outRect.top =mRowSpace;
outRect.right =mColumnSpace;
}
private void getLinearVerticalOffsets(@NonNull Rect outRect, @NonNull RecyclerView parent, int type, int position) {
if (position ==0) {
outRect.top =mRowSpace;
}
if (type <0) {
return;
}
outRect.bottom =mRowSpace;
outRect.left =mColumnSpace;
outRect.right =mColumnSpace;
}
private void getGridHorizontalOffsets(GridLayoutManager gridLayoutManager, @NonNull Rect outRect, @NonNull RecyclerView parent, int type, int position, int spanCount, int count) {
GridLayoutManager.SpanSizeLookup sizeLookup = gridLayoutManager.getSpanSizeLookup();
if(sizeLookup==null){
return;
}
final int groupIndex = sizeLookup.getSpanGroupIndex(position, spanCount);
int index = sizeLookup.getSpanIndex(position, spanCount);
int spanSize = sizeLookup.getSpanSize(position);
if(groupIndex==0){
outRect.left =mColumnSpace;
}
if (type <0) {
return;
}
outRect.right=mColumnSpace;
int column=(index+spanSize)%spanCount;
outRect.top = index==0?mRowSpace:mRowSpace/2;
outRect.bottom=column==0?mRowSpace:mRowSpace/2;
}
private void getGridVerticalOffsets(GridLayoutManager gridLayoutManager, @NonNull Rect outRect, @NonNull RecyclerView parent, int type, int position, int spanCount, int count) {
GridLayoutManager.SpanSizeLookup sizeLookup = gridLayoutManager.getSpanSizeLookup();
if(sizeLookup==null){
return;
}
final int groupIndex = sizeLookup.getSpanGroupIndex(position, spanCount);
int index = sizeLookup.getSpanIndex(position, spanCount);
int spanSize = sizeLookup.getSpanSize(position);
if(groupIndex==0){
outRect.top =mRowSpace;
}
if (type <0) {
return;
}
outRect.bottom =mRowSpace;
int column=(index+spanSize)%spanCount;
outRect.left = index==0?mColumnSpace:mColumnSpace/2;
outRect.right=column==0?mColumnSpace:mColumnSpace/2;
}
public BaseMultiItemDecoration(int space) {
this.mColumnSpace =mRowSpace = space;
}
public BaseMultiItemDecoration(int rowSpace, int columnSpace) {
this.mRowSpace = rowSpace;
this.mColumnSpace = columnSpace;
}
}