Wie kann eine Trennlinie in einem Android RecyclerView hinzugefügt werden?

221

Ich entwickle eine Android-Anwendung, in der ich verwende RecyclerView. Ich brauche einen hinzuzufügen Teiler in RecyclerView. Ich habe versucht hinzuzufügen -

recyclerView.addItemDecoration(new
     DividerItemDecoration(getActivity(),
       DividerItemDecoration.VERTICAL_LIST));

Unten ist mein XML-Code -

   <android.support.v7.widget.RecyclerView
    android:id="@+id/drawerList"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="15dp"
    />
Sofquestion 8
quelle
3
Ich denke, dies wird Ihnen helfen stackoverflow.com/q/24618829/942224
Sanket Kachhela
Verwenden Sie diese
Kishan Solanki
Ich denke, Ihr Code ist korrekt. Ich sehe kein Problem.
Rohit Rawat

Antworten:

282

Im Oktober 2016-Update ist für die Support-Bibliothek v25.0.0 jetzt eine Standardimplementierung grundlegender horizontaler und vertikaler Teiler verfügbar!

https://developer.android.com/reference/android/support/v7/widget/DividerItemDecoration.html

 recyclerView.addItemDecoration(new DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.VERTICAL));
Aditya Vyas-Lakhan
quelle
3
Hallo danke für die Information! Gibt es eine Möglichkeit, den Teiler nach dem letzten Element zu entfernen? Ich habe nur eine Kartenansicht, in der die Liste implementiert ist und der Teiler + Schatten der Kartenansicht unten nicht gut aussieht!
Maxi
4
Ich hatte das gleiche Problem und löste es, indem ich DividerItemDecoration erweiterte und getItemOffsets überschrieb und dann nur dann super aufrief, wenn ich nicht beim ersten Element bin. if(parent.getChildAdapterPosition(view) == state.getItemCount() - 1)dann kehre zurück, sonst rufe die Oberklasse an getItemOffsets().
Robin
13
Stattdessen habe mLayoutManager.getOrientation()ich verwendet DividerItemDecoration.VERTICALund es hat funktioniert, da mein RecyclerView vertikal ist.
Aaron Lelevier
2
Gibt es eine Möglichkeit, die Farbe des Teilers mithilfe dieser integrierten Methode zu ändern?
j2emanue
1
@ V.Kalyuzhnyu @android:attr/listDividerim App-Thema zeigt keinen Teiler an, wenn es sich um eine Farbressource handelt. Ich musste eine Form erstellen, die mit meiner Farbe mit einer festen Höhe gezeichnet werden kann.
A. Ferrand
226

Der richtige Weg ist, ItemDecorationfür das RecyclerViewfolgende zu definieren

SimpleDividerItemDecoration.java

public class SimpleDividerItemDecoration extends RecyclerView.ItemDecoration {
    private Drawable mDivider;

    public SimpleDividerItemDecoration(Context context) {
        mDivider = context.getResources().getDrawable(R.drawable.line_divider);
    }

    @Override
    public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
        int left = parent.getPaddingLeft();
        int right = parent.getWidth() - parent.getPaddingRight();

        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);
        }
    }
}

line_divider.xml:

<?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="1dp" />

    <solid android:color="@color/dark_gray" />

</shape>

Stellen Sie es schließlich so ein

recyclerView.addItemDecoration(new SimpleDividerItemDecoration(this));

Bearbeiten

Wie von @Alan Solitar gezeigt

context.getResources().getDrawable(R.drawable.line_divider); 

wird abgeschrieben, stattdessen können Sie verwenden

ContextCompat.getDrawable(context,R.drawable.line_divider);
NJ
quelle
3
context.getResources (). getDrawable (R.drawable.line_divider) ist jetzt veraltet.
Alan S.
2
Kein Problem. Dies ist eine gute Antwort und es hat perfekt für mich funktioniert. Danke dir.
Alan S.
3
Das funktioniert auf meiner Seite perfekt. Ich frage mich jedoch, warum nicht für jede Zelle eine einfache <Ansicht> für dieses Trennzeichen in das Layout eingefügt werden sollte. Es ist viel weniger Code. Ist diese Lösung weniger leistungsmäßig? tx
Greg
4
Ein Problem mit dieser Implementierung tritt auf, wenn Sie versuchen, Elemente zu wischen oder zu verschieben.
TerNovi
1
@NJ Danke Alter, du hast meine Zeit gespart.
Suhas Bachewar
40

Wenn Sie sowohl horizontale als auch vertikale Teiler haben möchten:

  1. Definieren Sie horizontale und vertikale Teiler-Drawables:

    horizontal_divider.xml

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android" >
      <size android:height="1dip" />
      <solid android:color="#22000000" />
    </shape>

    vertikale_divider.xml

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android" >
        <size android:width="1dip" />
        <solid android:color="#22000000" />
    </shape>
  2. Fügen Sie dieses Codesegment unten hinzu:

    DividerItemDecoration verticalDecoration = new DividerItemDecoration(recyclerview.getContext(),
            DividerItemDecoration.HORIZONTAL);
    Drawable verticalDivider = ContextCompat.getDrawable(getActivity(), R.drawable.vertical_divider);
    verticalDecoration.setDrawable(verticalDivider);
    recyclerview.addItemDecoration(verticalDecoration);
    
    DividerItemDecoration horizontalDecoration = new DividerItemDecoration(recyclerview.getContext(),
            DividerItemDecoration.VERTICAL);
    Drawable horizontalDivider = ContextCompat.getDrawable(getActivity(), R.drawable.horizontal_divider);
    horizontalDecoration.setDrawable(horizontalDivider);
    recyclerview.addItemDecoration(horizontalDecoration);
Mohammed Mukhtar
quelle
Es funktionierte. Wenn Sie jedoch horizontal_divider.xml ändern , um die Breite zu teilen, und vertikale_divider.xml , um die Höhe zu teilen, können Sie DividerItemDecorationdiese wie folgt erstellen : verticalDecoration = new DividerItemDecoration(recyclerview.getContext(), DividerItemDecoration.VERTICAL);und horizontalDecoration = new DividerItemDecoration(recyclerview.getContext(), DividerItemDecoration.HORIZONTAL);.
Ruben O. Chiavone
33

Alle diese Antworten haben mich nahe gebracht, aber ihnen fehlte jeweils ein wichtiges Detail. Nach ein wenig Recherche fand ich den einfachsten Weg, eine Kombination dieser drei Schritte zu sein:

  1. Verwenden Sie die DividerItemDecoration der Support-Bibliothek
  2. Erstellen Sie einen Teiler mit der richtigen Farbe
  3. Legen Sie diesen Teiler in Ihrem Thema als listDivider fest

Schritt 1: Während der Konfiguration von RecyclerView

recyclerView.addItemDecoration(
        new DividerItemDecoration(context, layoutManager.getOrientation()));

Schritt 2: In einer Datei wie res / drawable / divider_gray.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <size android:width="1px" android:height="1px" />
    <solid android:color="@color/gray" />
</shape>

Schritt 3: im Thema der App

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Other theme items above -->
    <item name="android:listDivider">@drawable/divider_gray</item>
</style>

BEARBEITEN: Aktualisiert, um den letzten Teiler zu überspringen:
Nachdem ich dies ein wenig verwendet hatte, stellte ich fest, dass nach dem letzten Element ein Teiler gezeichnet wurde, was ärgerlich war. Daher habe ich Schritt 1 wie folgt geändert , um dieses Standardverhalten in DividerItemDecoration zu überschreiben (natürlich ist das Erstellen einer separaten Klasse eine weitere Option):

recyclerView.addItemDecoration(
        new DividerItemDecoration(context, layoutManager.getOrientation()) {
            @Override
            public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
                int position = parent.getChildAdapterPosition(view);
                // hide the divider for the last child
                if (position == parent.getAdapter().getItemCount() - 1) {
                    outRect.setEmpty();
                } else {
                    super.getItemOffsets(outRect, view, parent, state);
                }
            }
        }
);
gMännlich
quelle
7
Das Überschreiben von getItemOffsets scheint für mich nicht zu funktionieren. Selbst wenn ich überschreibe und niemals Super nenne, ist der Teiler immer noch gezeichnet. Ich bin mir nicht sicher, was sich geändert hat.
Übersetzung
2
Das funktioniert auch bei mir nicht. Der letzte Teiler wird noch angezeigt.
Sotti
1
Am Ende habe ich meine eigene Teilerklasse erstellt, indem ich die Quelle von DividerItemDecoration kopiert habe, und ein wenig geändert, um nicht den letzten Teiler zu zeichnen. Ignorieren Sie in der Zeichenmethode einfach die letzte for (int i = 0; i < childCount; i++)for (int i = 0; i < childCount - 1; i++)
untergeordnete
Da ItemDecoration vor dem Listenelement ("unter" Listenelement) gezeichnet wird, funktioniert die angegebene Lösung nur, wenn Ihr Listenelement einen zu 100% undurchsichtigen Hintergrund hat oder wenn die zu zeichnende Dekoration zu 100% transparent ist (sodass der Benutzer den Hintergrund von recyclerView sieht). Andernfalls ist der Teiler sichtbar, egal was Sie in getItemOffsets ()
ernazm
31

Fügen Sie einfach eine Ansicht am Ende Ihres Artikeladapters hinzu:

<View
 android:layout_width="match_parent"
 android:layout_height="1dp"
 android:background="#FFFFFF"/>
Lucas Diego
quelle
25
Mit dieser Lösung erhalten Sie auch die Trennlinie am Ende der Liste.
Arià
5
Die letzte Zeile kann programmgesteuert entfernt werden, indem Sie in onBindViewHolder so etwas sagen. if(position == getItemCount() - 1) { mDividerView.setVisibility(View.INVISIBLE) }Oder es muss andere Möglichkeiten geben, dies zu tun.
Ali Kazi
Die meiste Zeit ist die letzte Linie mit 1pxder Höhe für unsere Augen unsichtbar
Mehdi Khademloo
@ LucasDiego Das wird funktionieren, aber wir wissen, dass das Aufblasen teuer ist.
Zohra Khan
21

Hier ist der Code für einen einfachen benutzerdefinierten Teiler (vertikaler Teiler / 1dp Höhe / schwarz):

Angenommen, Sie haben eine Support-Bibliothek:

compile "com.android.support:recyclerview-v7:25.1.1"

Java-Code

    DividerItemDecoration divider = new DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.VERTICAL);
    divider.setDrawable(ContextCompat.getDrawable(getBaseContext(), R.drawable.my_custom_divider));
    recyclerView.addItemDecoration(divider);

dann das Beispiel der Datei custom_divider.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
    <size android:height="1dp" />
    <solid android:color="@android:color/black" />
</shape>
Tobliug
quelle
10

Erstellen Sie eine separate XML-Datei im Ordner res / drawable

 <?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
    <size android:height="1dp" />
    <solid android:color="@android:color/black" />
</shape>

Verbinden Sie diese XML-Datei (Ihre_Datei) in der Hauptaktivität wie folgt :

DividerItemDecoration divider = new DividerItemDecoration(
    recyclerView.getContext(),
    DividerItemDecoration.VERTICAL
);
divider.setDrawable(ContextCompat.getDrawable(getBaseContext(), R.drawable.your_file));
recyclerView.addItemDecoration(divider);
Anushka Madusanka
quelle
Wie füge ich Polster hinzu? Die Verwendung von Polstern in Form funktioniert nicht.
Makalele
9

Kotlin Version:

recyclerview.addItemDecoration(DividerItemDecoration(this, LinearLayoutManager.VERTICAL))
Duracell De Monaco
quelle
8

Ich denke, Sie verwenden Fragmentszu habenRecyclerView

Fügen Sie diese Zeilen einfach hinzu, nachdem Sie Ihre RecyclerViewund LayoutManagerObjekte erstellt haben

DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(),
                DividerItemDecoration.VERTICAL);
        recyclerView.addItemDecoration(dividerItemDecoration);

Das ist es!

Es unterstützt sowohl die horizontale als auch die vertikale Ausrichtung.

Vivek Maru
quelle
8

Probieren Sie diesen einfachen einzeiligen Code aus

recyclerView.addItemDecoration(new DividerItemDecoration(getContext(),LinearLayoutManager.VERTICAL)); 
Pravin Perumal
quelle
7

Sie müssen die nächste Zeile hinzufügen ...

mRecyclerView.addItemDecoration(new DividerItemDecoration(getContext(), DividerItemDecoration.VERTICAL));
pablopatarca
quelle
7

Die Art und Weise, wie ich mit der Teileransicht und auch mit Teilereinsätzen umgehe, besteht darin, eine RecyclerView-Erweiterung hinzuzufügen.

1.

Fügen Sie eine neue Erweiterungsdatei hinzu, indem Sie View oder RecyclerView benennen:

RecyclerViewExtension.kt

und fügen Sie die setDividerErweiterungsmethode in die Datei RecyclerViewExtension.kt ein.

/*
* RecyclerViewExtension.kt
* */
import androidx.annotation.DrawableRes
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.RecyclerView


fun RecyclerView.setDivider(@DrawableRes drawableRes: Int) {
    val divider = DividerItemDecoration(
        this.context,
        DividerItemDecoration.VERTICAL
    )
    val drawable = ContextCompat.getDrawable(
        this.context,
        drawableRes
    )
    drawable?.let {
        divider.setDrawable(it)
        addItemDecoration(divider)
    }
}

2.

Erstellen Sie eine Drawable-Ressourcendatei innerhalb des drawablePakets wie folgt recycler_view_divider.xml:

<inset xmlns:android="http://schemas.android.com/apk/res/android"
    android:insetLeft="10dp"
    android:insetRight="10dp">

    <shape>
        <size android:height="0.5dp" />
        <solid android:color="@android:color/darker_gray" />
    </shape>

</inset>

Hier können Sie den linken und rechten Rand an android:insetLeftund angeben android:insetRight.

3.

In Ihrer Aktivität oder Ihrem Fragment, in dem die RecyclerView initialisiert ist, können Sie die benutzerdefinierte Zeichnungsfunktion festlegen, indem Sie Folgendes aufrufen:

recyclerView.setDivider(R.drawable.recycler_view_divider)

4.

Prost 🍺

RecyclerView-Zeile mit Teiler.

Gent Berani
quelle
6

Dies ist möglicherweise nicht der richtige Weg, aber ich habe gerade eine Ansicht zur Einzelelementansicht der RecyclerView hinzugefügt (da ich nicht glaube, dass es eine integrierte Funktion gibt).

<View
    android:layout_width="fill_parent"
    android:layout_height="@dimen/activity_divider_line_margin"
    android:layout_alignParentBottom="true"
    android:background="@color/tasklist_menu_dividerline_grey" />

Dies bedeutet, dass jedes Element eine Zeile hat, die es am unteren Rand ausfüllt. Ich habe es ungefähr 1dp hoch mit einem #111111Hintergrund gemacht. Dies gibt ihm auch eine Art "3D" -Effekt.

Zerschlagen
quelle
2
- Dies ist kein Weg
Anand Tiwari
5

Sie können einen einfachen wiederverwendbaren Teiler erstellen.

Teiler erstellen:

public class DividerItemDecorator extends RecyclerView.ItemDecoration {
    private Drawable mDivider;

    public DividerItemDecorator(Drawable divider) {
        mDivider = divider;
    }

    @Override
    public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state) {
        int dividerLeft = parent.getPaddingLeft();
        int dividerRight = parent.getWidth() - parent.getPaddingRight();

        int childCount = parent.getChildCount();
        for (int i = 0; i < childCount; i++) {
            View child = parent.getChildAt(i);

            RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();

            int dividerTop = child.getBottom() + params.bottomMargin;
            int dividerBottom = dividerTop + mDivider.getIntrinsicHeight();

            mDivider.setBounds(dividerLeft, dividerTop, dividerRight, dividerBottom);
            mDivider.draw(canvas);
        }
    }
}

Trennlinie erstellen: divider.xml

<?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="1dp" />
    <solid android:color="@color/grey_300" />
</shape>

Fügen Sie Ihrem Recyclerview einen Teiler hinzu:

RecyclerView.ItemDecoration dividerItemDecoration = new DividerItemDecorator(ContextCompat.getDrawable(context, R.drawable.divider));
recyclerView.addItemDecoration(dividerItemDecoration);

So entfernen Sie den Teiler für das letzte Element:

Um zu verhindern, dass für das letzte Element ein Teiler gezeichnet wird, müssen Sie diese Zeile ändern.

for (int i = 0; i < childCount; i++) 

Zu

for (int i = 0; i < childCount-1; i++)

Ihre endgültige Implementierung sollte folgendermaßen aussehen:

public class DividerItemDecorator extends RecyclerView.ItemDecoration {
    private Drawable mDivider;

    public DividerItemDecorator(Drawable divider) {
        mDivider = divider;
    }

    @Override
    public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state) {
        int dividerLeft = parent.getPaddingLeft();
        int dividerRight = parent.getWidth() - parent.getPaddingRight();

        int childCount = parent.getChildCount();
        for (int i = 0; i < childCount - 1; i++) {
            View child = parent.getChildAt(i);

            RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();

            int dividerTop = child.getBottom() + params.bottomMargin;
            int dividerBottom = dividerTop + mDivider.getIntrinsicHeight();

            mDivider.setBounds(dividerLeft, dividerTop, dividerRight, dividerBottom);
            mDivider.draw(canvas);
        }
    }
}

Ich hoffe es hilft:)

Bhuvanesh BS
quelle
1
Dies funktioniert perfekt Ich weiß nicht, warum es nicht die akzeptierte Antwort ist
Kennedy Kambo
2

Der RecyclerView-FlexibleDivider von yqritc macht dies zu einem Einzeiler . Fügen Sie dies zunächst zu Ihrem hinzu build.gradle:

compile 'com.yqritc:recyclerview-flexibledivider:1.4.0' // requires jcenter()

Jetzt können Sie einen Divder konfigurieren und hinzufügen, in dem Sie den Adapter Ihres recyclerView einstellen:

recyclerView.setAdapter(myAdapter);
recyclerView.addItemDecoration(new HorizontalDividerItemDecoration.Builder(this).color(Color.RED).sizeResId(R.dimen.divider).marginResId(R.dimen.leftmargin, R.dimen.rightmargin).build());
Gaurav Vachhani
quelle
16
@Gaurav, wo befindet sich die HorizontalDividerItemDecorationKlasse?
iRuth
@iRuth, Sie müssen die Maven-Bibliothek in Ihre .gradle-Datei hinzufügen github.com/yqritc/RecyclerView-FlexibleDivider
Hakem Zaied
5
Dies ist eine unvollständige Antwort. Vielleicht ist eine Abwertung angebracht.
Wochenende
Es ist gut zu erwähnen, dass für dieses @ gaurav-vachhani
Andrew V.
2

Android macht kleine Dinge leider nur zu kompliziert. Der einfachste Weg, um das zu erreichen, was Sie wollen, ohne DividerItemDecoration hier zu implementieren:

Fügen Sie der RecyclerView die Hintergrundfarbe zu Ihrer gewünschten Teilerfarbe hinzu:

<RecyclerView
    android:id="@+id/rvList"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:divider="@color/colorLightGray"
    android:scrollbars="vertical"
    tools:listitem="@layout/list_item"
    android:background="@android:color/darker_gray"/>

Fügen Sie den unteren Rand (android: layout_marginBottom) zum Layout-Stammverzeichnis des Elements (list_item.xml) hinzu:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginBottom="1dp">

    <TextView
        android:id="@+id/tvName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="John Doe" />

    <TextView
        android:id="@+id/tvDescription"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/tvName"
        android:text="Some description blah blah" />

</RelativeLayout>

Dies sollte einen Abstand von 1 dp zwischen den Elementen und der Hintergrundfarbe von RecyclerView bieten (dunkelgrau wird als Teiler angezeigt).

John Gummadi
quelle
1

Um die Antwort von NJ ein wenig zu vereinfachen, können Sie Folgendes tun:

public class DividerColorItemDecoration extends DividerItemDecoration {

    public DividerColorItemDecoration(Context context, int orientation) {
        super(context, orientation);
        setDrawable(ContextCompat.getDrawable(context, R.drawable.line_divider));
    }
}
Will Poitras
quelle
1

Fügen Sie einfach einen Rand von x am unteren Rand eines Artikels in Ihrem hinzu RecycleView Adapter.

onCreateViewHolder

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);

layoutParams.setMargins(0, 0, 0, 5);
itemView.setLayoutParams(layoutParams);
S Sathiya
quelle
1
recyclerview.addItemDecoration(new DividerItemDecoration(this, 0));

Wo 0ist horizontal und 1ist veritical

Freny Christian
quelle
3
Verwenden Sie besser die konstante Variable, da sich der Wert in der zukünftigen Version der Support-Bibliothek ändern könnte
Irshu,
true .. wir sollten LinearLayoutManager.HORIZONTAL oder LinearLayoutManager.VERTICAL anstelle von 0 oder 1 verwenden
Freny Christian
0
  class ItemOffsetDecoration(
        context: Context,
        private val paddingLeft: Int,
        private val paddingRight: Int
    ) : RecyclerView.ItemDecoration() {
        private var mDivider: Drawable? = null

        init {
            mDivider = ContextCompat.getDrawable(context, R.drawable.divider_medium)
        }

        override fun onDrawOver(c: Canvas, parent: RecyclerView, state: RecyclerView.State) {
            val left = parent.paddingLeft + paddingLeft
            val right = parent.width - parent.paddingRight - paddingRight
            val childCount = parent.childCount
            for (i in 0 until childCount) {
                val child = parent.getChildAt(i)
                val params = child.layoutParams as RecyclerView.LayoutParams
                val top = child.bottom + params.bottomMargin
                val bottom = top + (mDivider?.intrinsicHeight ?: 0)

                mDivider?.let {
                    it.setBounds(left, top, right, bottom)
                    it.draw(c)
                }
            }
        }
    }

Sie müssen nur eine Farbe in R.drawable.divider_medium angeben

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@android:color/black" />
    <size
        android:height="1dp"
        android:width="1dp" />

</shape>

und fügen Sie es Ihrem recyclerView hinzu

recyclerView.addItemDecoration(
                        ItemOffsetDecoration(
                            this,
                            resources.getDimension(resources.getDimension(R.dimen.dp_70).roundToInt()).roundToInt(),
                            0
                        )
                    )

Verweise darauf

Abhay Pratap
quelle
0

Die Bhuvanesh BS-Lösung funktioniert. Kotlin-Version davon:

import android.graphics.Canvas
import android.graphics.drawable.Drawable
import androidx.recyclerview.widget.RecyclerView

class DividerItemDecorator(private val mDivider: Drawable?) : RecyclerView.ItemDecoration() {

    override fun onDraw(
        canvas: Canvas,
        parent: RecyclerView,
        state: RecyclerView.State
    ) {

        val dividerLeft = parent.paddingLeft
        val dividerRight = parent.width - parent.paddingRight
        for (i in 0 until parent.childCount - 1) {
            val child = parent.getChildAt(i)
            val dividerTop =
                child.bottom + (child.layoutParams as RecyclerView.LayoutParams).bottomMargin
            val dividerBottom = dividerTop + mDivider!!.intrinsicHeight
            mDivider.setBounds(dividerLeft, dividerTop, dividerRight, dividerBottom)
            mDivider.draw(canvas)
        }
    }
}
BestUserApps
quelle
0

Ich denke, es ist der einfachste Weg

mDividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(),
                DividerItemDecoration.VERTICAL);
// or DividerItemDecoration.HORIZONTALL
        mDividerItemDecoration.setDrawable(getDrawable(R.drawable.myshape));
        recyclerView.addItemDecoration(mDividerItemDecoration);

Beachten Sie Folgendes : myshape kann ein Rechteck mit der Höhe sein, die Sie zu Ihrem Teiler machen möchten

Abdelrahman Hussein
quelle