Suche…


Syntax

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:

Geben Sie hier die Bildbeschreibung ein

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>


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow