1127 Stimmen

Wie man Trennlinien und Abstände zwischen Elementen in RecyclerView hinzufügt

Dies ist ein Beispiel dafür, wie es vorher in der ListView-Klasse gemacht werden konnte, unter Verwendung der Parameter divider und dividerHeight:

Ich sehe jedoch keine solche Möglichkeit in der RecyclerView-Klasse.

In diesem Fall ist es okay, Margins zu definieren und/oder eine benutzerdefinierte Trennlinie direkt in das Layout eines Listenelements hinzuzufügen oder gibt es einen besseren Weg, um mein Ziel zu erreichen?

24voto

Yoann Hercouet Punkte 17691

Da es bisher keinen richtigen Weg gibt, um dies ordnungsgemäß mit Material Design zu implementieren, habe ich einfach den folgenden Trick angewendet, um einen Trenner direkt zum Listenelement hinzuzufügen:

20voto

Linh Punkte 49889

Statt ein Shape-XML zum Ändern der Höhe und Farbe des Dividers zu erstellen, können Sie es programmatisch erstellen:

val divider = DividerItemDecoration(
                  context,
                  DividerItemDecoration.VERTICAL)

divider.setDrawable(ShapeDrawable().apply {
    intrinsicHeight = resources.getDimensionPixelOffset(R.dimen.dp_15)
    paint.color = Color.RED // Hinweis:
                            //   Aktuell (Support-Version 28.0.0) können wir
                            //   hier keine transparente Farbe verwenden. Wenn
                            //   wir transparent verwenden, sehen wir trotzdem eine
                            //   kleine Trennlinie. Wenn wir also transparenten Raum anzeigen möchten,
                            //   können wir die Farbe auf die Hintergrundfarbe setzen
                            //   oder einen benutzerdefinierten ItemDecoration erstellen
                            //   anstatt DividerItemDecoration.
})

recycler_devices.addItemDecoration(divider)

15voto

friday Punkte 1288

OKTOBER 2016 UPDATE

Mit der Support-Bibliothek v25.0.0 gibt es nun endlich eine Standardimplementierung von grundlegenden horizontalen und vertikalen Trennlinien!

DividerItemDecoration

13voto

Quantum Mattter Punkte 164

Fügen Sie Ihrem View einen Rand hinzu. Bei mir hat es funktioniert.

android:layout_marginTop="10dp"

Wenn Sie nur gleichen Abstand hinzufügen möchten und dies in XML tun möchten, setzen Sie einfach padding für Ihren RecyclerView und den gleichen Betrag an layoutMargin für das Element, das Sie in Ihren RecyclerView einfügen, und lassen Sie die Hintergrundfarbe den Abstand bestimmen.

13voto

Ryan Amaral Punkte 3774

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X