Android
RecyclerView-Dekorationen
Suche…
Syntax
- RecyclerView AddItemDecoration (RecyclerView.ItemDecoration-Dekoration)
- RecyclerView AddItemDecoration (RecyclerView.ItemDecoration-Dekoration, int-Index)
Parameter
Parameter | Einzelheiten |
---|---|
Dekoration | die Elementdekoration, die der RecyclerView hinzugefügt werden soll |
Index | der Index in der Dekorationsliste für diese RecyclerView . In dieser Reihenfolge werden getItemOffset und onDraw aufgerufen. Spätere Anrufe überholen möglicherweise die vorherigen. |
Bemerkungen
Dekorationen sind statisch
Da Dekorationen nur gezeichnet werden, ist es nicht möglich, Klicklistener oder andere UI-Funktionen hinzuzufügen.
Mehrere Dekorationen
Das Hinzufügen mehrerer Dekorationen zu einem RecyclerView
wird in einigen Fällen funktionieren, aber es gibt derzeit keine öffentliche API, um andere mögliche Dekorationen beim Messen oder Zeichnen zu berücksichtigen. Sie können die Ansichtsgrenzen oder die Ansicht verzierte Grenzen erhalten, wobei die dekorierten Grenzen die Summe aller angewendeten Dekorationsversätze sind.
Andere verwandte Themen:
RecyclerView
RecyclerView onClickListeners
Offizieller Javadoc
https://developer.android.com/reference/android/support/v7/widget/RecyclerView.ItemDecoration.html
Separator zeichnen
Dies wird eine Linie am unteren Rand jeder Ansicht zeichnen, die letzte als Trennzeichen zwischen Elementen.
public class SeparatorDecoration extends RecyclerView.ItemDecoration {
private final Paint mPaint;
private final int mAlpha;
public SeparatorDecoration(@ColorInt int color, float width) {
mPaint = new Paint();
mPaint.setColor(color);
mPaint.setStrokeWidth(width);
mAlpha = mPaint.getAlpha();
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) view.getLayoutParams();
// we retrieve the position in the list
final int position = params.getViewAdapterPosition();
// add space for the separator to the bottom of every view but the last one
if (position < state.getItemCount()) {
outRect.set(0, 0, 0, (int) mPaint.getStrokeWidth()); // left, top, right, bottom
} else {
outRect.setEmpty(); // 0, 0, 0, 0
}
}
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
// a line will draw half its size to top and bottom,
// hence the offset to place it correctly
final int offset = (int) (mPaint.getStrokeWidth() / 2);
// this will iterate over every visible view
for (int i = 0; i < parent.getChildCount(); i++) {
final View view = parent.getChildAt(i);
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) view.getLayoutParams();
// get the position
final int position = params.getViewAdapterPosition();
// and finally draw the separator
if (position < state.getItemCount()) {
// apply alpha to support animations
mPaint.setAlpha((int) (view.getAlpha() * mAlpha));
float positionY = view.getBottom() + offset + view.getTranslationY();
// do the drawing
c.drawLine(view.getLeft() + view.getTranslationX(),
positionY,
view.getRight() + view.getTranslationX(),
positionY,
mPaint);
}
}
}
}
Artikelbezogene Ränder bei ItemDecoration
Sie können RecyclerView.ItemDecoration
, um jedes Element in einer RecyclerView mit zusätzlichen Rändern zu versehen. Dies kann in einigen Fällen sowohl Ihre Adapterimplementierung als auch Ihre XML für die Elementansicht bereinigen.
public class MyItemDecoration
extends RecyclerView.ItemDecoration {
private final int extraMargin;
@Override
public void getItemOffsets(Rect outRect, View view,
RecyclerView parent, RecyclerView.State state) {
int position = parent.getChildAdapterPosition(view);
// It's easy to put extra margin on the last item...
if (position + 1 == parent.getAdapter().getItemCount()) {
outRect.bottom = extraMargin; // unit is px
}
// ...or you could give each item in the RecyclerView different
// margins based on its position...
if (position % 2 == 0) {
outRect.right = extraMargin;
} else {
outRect.left = extraMargin;
}
// ...or based on some property of the item itself
MyListItem item = parent.getAdapter().getItem(position);
if (item.isFirstItemInSection()) {
outRect.top = extraMargin;
}
}
public MyItemDecoration(Context context) {
extraMargin = context.getResources()
.getDimensionPixelOffset(R.dimen.extra_margin);
}
}
Um die Dekoration zu aktivieren, fügen Sie sie einfach Ihrem RecyclerView hinzu:
// in your onCreate()
RecyclerView rv = (RecyclerView) findItemById(R.id.myList);
rv.addItemDecoration(new MyItemDecoration(context));
Trenner zu RecyclerView hinzufügen
Zunächst müssen Sie eine Klasse erstellen, die RecyclerView.ItemDecoration
:
public class SimpleBlueDivider extends RecyclerView.ItemDecoration {
private Drawable mDivider;
public SimpleBlueDivider(Context context) {
mDivider = context.getResources().getDrawable(R.drawable.divider_blue);
}
@Override
public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
//divider padding give some padding whatever u want or disable
int left =parent.getPaddingLeft()+80;
int right = parent.getWidth() - parent.getPaddingRight()-30;
int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
View child = parent.getChildAt(i);
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
int top = child.getBottom() + params.bottomMargin;
int bottom = top + mDivider.getIntrinsicHeight();
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
}
}
divider_blue.xml
zu deinem Zeichenordner hinzu:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<size android:width="1dp" android:height="4dp" />
<solid android:color="#AA123456" />
</shape>
Dann benutze es wie:
recyclerView.addItemDecoration(new SimpleBlueDivider(context));
Das Ergebnis wird wie folgt aussehen:
Dieses Bild ist nur ein Beispiel für die Funktionsweise von Teilern. Wenn Sie beim Hinzufügen von Teilern die Angaben zum Material Design beachten möchten, schauen Sie sich diesen Link an: Teiler und danke @Brenden Kromhout, indem Sie einen Link angeben .
So fügen Sie Teiler mit und DividerItemDecoration hinzu
Die DividerItemDecoration
ist eine RecyclerView.ItemDecoration
, die als Trenner zwischen Elementen verwendet werden kann.
DividerItemDecoration mDividerItemDecoration = new DividerItemDecoration(context,
mLayoutManager.getOrientation());
recyclerView.addItemDecoration(mDividerItemDecoration);
Es unterstützt beide Orientierungen mit DividerItemDecoration.VERTICAL
und DividerItemDecoration.HORIZONTAL
.
ItemOffsetDecoration für GridLayoutManager in RecycleView
Das folgende Beispiel hilft, einem Element in GridLayout den gleichen Platz zu geben.
ItemOffsetDecoration.java
public class ItemOffsetDecoration extends RecyclerView.ItemDecoration {
private int mItemOffset;
private int spanCount = 2;
public ItemOffsetDecoration(int itemOffset) {
mItemOffset = itemOffset;
}
public ItemOffsetDecoration(@NonNull Context context, @DimenRes int itemOffsetId) {
this(context.getResources().getDimensionPixelSize(itemOffsetId));
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
int position = parent.getChildLayoutPosition(view);
GridLayoutManager manager = (GridLayoutManager) parent.getLayoutManager();
if (position < manager.getSpanCount())
outRect.top = mItemOffset;
if (position % 2 != 0) {
outRect.right = mItemOffset;
}
outRect.left = mItemOffset;
outRect.bottom = mItemOffset;
}
}
Sie können ItemDecoration wie folgt aufrufen.
recyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);
GridLayoutManager lLayout = new GridLayoutManager(getActivity(), 2);
ItemOffsetDecoration itemDecoration = new ItemOffsetDecoration(mActivity, R.dimen.item_offset);
recyclerView.addItemDecoration(itemDecoration);
recyclerView.setLayoutManager(lLayout);
und Beispiel Artikelversatz
<dimen name="item_offset">5dp</dimen>