Android
Decorazioni RecyclerView
Ricerca…
Sintassi
- RecyclerView addItemDecoration (decorazione RecyclerView.ItemDecoration)
- RecyclerView addItemDecoration (RecyclerView.ItemDecoration decoration, int index)
Parametri
Parametro | Dettagli |
---|---|
decorazione | la decorazione dell'oggetto da aggiungere a RecyclerView |
indice | l'indice nella lista delle decorazioni per questo RecyclerView . Questo è l'ordine in cui vengono chiamati getItemOffset e onDraw . Le chiamate successive potrebbero sovrascrivere quelle precedenti. |
Osservazioni
Le decorazioni sono statiche
Poiché le decorazioni sono solo disegnate, non è possibile aggiungere ad esse clicker o altre funzionalità dell'interfaccia utente.
Decorazioni multiple
In alcuni casi, l'aggiunta di decorazioni multiple a RecyclerView
funzionerà, ma attualmente non ci sono API pubbliche per tenere conto di altre decorazioni possibili durante la misurazione o il disegno. È possibile ottenere i limiti della vista o i bordi decorati della vista, in cui i bordi decorati sono la somma di tutti gli offset decorativi applicati.
Altri argomenti correlati:
RecyclerView
RecyclerView onClickListeners
Javadoc ufficiale
https://developer.android.com/reference/android/support/v7/widget/RecyclerView.ItemDecoration.html
Disegnare un separatore
Questo disegnerà una linea in fondo a ogni vista ma l'ultima a fare da separatore tra gli elementi.
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);
}
}
}
}
Margini per articolo con ItemDecoration
È possibile utilizzare RecyclerView.ItemDecoration
per aggiungere margini aggiuntivi a ciascun elemento in RecyclerView. In alcuni casi questo può ripulire sia l'implementazione dell'adattatore che il codice XML della vista articolo.
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);
}
}
Per abilitare la decorazione, è sufficiente aggiungerla a RecyclerView:
// in your onCreate()
RecyclerView rv = (RecyclerView) findItemById(R.id.myList);
rv.addItemDecoration(new MyItemDecoration(context));
Aggiungi divisore a RecyclerView
Prima di tutto è necessario creare una classe che estenda 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);
}
}
}
Aggiungi divider_blue.xml
alla tua cartella drawable:
<?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>
Quindi usarlo come:
recyclerView.addItemDecoration(new SimpleBlueDivider(context));
Il risultato sarà come:
Questa immagine è solo un esempio di come funzionano i divisori, se si desidera seguire le specifiche di Material Design quando si aggiungono i divisori si prega di dare un'occhiata a questo link: divisori e grazie @Brenden Kromhout fornendo link.
Come aggiungere divisori usando e DividerItemDecoration
DividerItemDecoration
è un RecyclerView.ItemDecoration
che può essere utilizzato come divisore tra gli elementi.
DividerItemDecoration mDividerItemDecoration = new DividerItemDecoration(context,
mLayoutManager.getOrientation());
recyclerView.addItemDecoration(mDividerItemDecoration);
Supporta entrambi gli orientamenti utilizzando DividerItemDecoration.VERTICAL
e DividerItemDecoration.HORIZONTAL
.
ItemOffsetDecoration per GridLayoutManager in RecycleView
L'esempio seguente aiuterà a dare lo stesso spazio a un oggetto in GridLayout.
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;
}
}
Puoi chiamare ItemDecoration come sotto il codice.
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);
e offset dell'elemento di esempio
<dimen name="item_offset">5dp</dimen>