Für diejenigen, die nur nach Platz zwischen den Elementen im RecyclerView
suchen, sehen Sie meinen Ansatz, bei dem Sie gleichmäßigen Platz zwischen allen Elementen erhalten, außer bei den ersten und letzten Elementen, wo ich einen größeren Abstand gegeben habe. Ich wende den Abstand nur links/rechts in einem horizontalen LayoutManager
und oben/unten in einem vertikalen LayoutManager
an.
public class PaddingItemDecoration extends RecyclerView.ItemDecoration {
private int mPaddingPx;
private int mPaddingEdgesPx;
public PaddingItemDecoration(Activity activity) {
final Resources resources = activity.getResources();
mPaddingPx = (int) resources.getDimension(R.dimen.paddingItemDecorationDefault);
mPaddingEdgesPx = (int) resources.getDimension(R.dimen.paddingItemDecorationEdge);
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
final int itemPosition = parent.getChildAdapterPosition(view);
if (itemPosition == RecyclerView.NO_POSITION) {
return;
}
int orientation = getOrientation(parent);
final int itemCount = state.getItemCount();
int left = 0;
int top = 0;
int right = 0;
int bottom = 0;
/** Horizontal */
if (orientation == LinearLayoutManager.HORIZONTAL) {
/** Alle Positionen */
left = mPaddingPx;
right = mPaddingPx;
/** Erste Position */
if (itemPosition == 0) {
left += mPaddingEdgesPx;
}
/** Letzte Position */
else if (itemCount > 0 && itemPosition == itemCount - 1) {
right += mPaddingEdgesPx;
}
}
/** Vertikal */
else {
/** Alle Positionen */
top = mPaddingPx;
bottom = mPaddingPx;
/** Erste Position */
if (itemPosition == 0) {
top += mPaddingEdgesPx;
}
/** Letzte Position */
else if (itemCount > 0 && itemPosition == itemCount - 1) {
bottom += mPaddingEdgesPx;
}
}
if (!isReverseLayout(parent)) {
outRect.set(left, top, right, bottom);
} else {
outRect.set(right, bottom, left, top);
}
}
private boolean isReverseLayout(RecyclerView parent) {
if (parent.getLayoutManager() instanceof LinearLayoutManager) {
LinearLayoutManager layoutManager = (LinearLayoutManager) parent.getLayoutManager();
return layoutManager.getReverseLayout();
} else {
throw new IllegalStateException("PaddingItemDecoration kann nur mit einem LinearLayoutManager verwendet werden.");
}
}
private int getOrientation(RecyclerView parent) {
if (parent.getLayoutManager() instanceof LinearLayoutManager) {
LinearLayoutManager layoutManager = (LinearLayoutManager) parent.getLayoutManager();
return layoutManager.getOrientation();
} else {
throw new IllegalStateException("PaddingItemDecoration kann nur mit einem LinearLayoutManager verwendet werden.");
}
}
}
Datei dimens.xml
10dp
20dp