Ricerca…


Sintassi

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:

inserisci la descrizione dell'immagine qui

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>


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow