it-swarm.com.de

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

Ich entwickle eine Android Anwendung, in der ich RecyclerView verwende. Ich muss ein Teiler in RecyclerView hinzufügen. 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"
    />
185
sofquestion 8

Im Oktober 2016-Update der Unterstützungsbibliothek v25.0.0 ist 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));
242

Der richtige Weg ist, ItemDecoration für RecyclerView wie folgt 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>

Zum Schluss setze es so

recyclerView.addItemDecoration(new SimpleDividerItemDecoration(this));

Bearbeiten

Wie von @Alan Solitar gezeigt

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

wird abgeschrieben, anstatt dass Sie verwenden können

ContextCompat.getDrawable(context,R.drawable.line_divider);
212
N J

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

  1. Definieren Sie horizontale und vertikale Teilerzeichen:

    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>
    

    vertical_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);
    
33

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

<View
 Android:layout_width="match_parent"
 Android:layout_height="1px"
 Android:background="#FFFFFF"/>

PDATE:

Für bessere Ergebnisse konvertieren Sie 1px in 1dp:

<View
     Android:layout_width="match_parent"
     Android:layout_height="1dp"
     Android:background="#FFFFFF"/>
28
Lucas Diego

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

  1. Verwenden Sie die Unterstützungsbibliothek DividerItemDecoration
  2. Erstellen Sie einen Teiler mit der richtigen Farbe
  3. Setzen Sie diesen Teiler in Ihrem Thema als listDivider

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>

EDIT: Aktualisiert, um den letzten Teiler zu überspringen:
Nachdem ich das ein bisschen benutzt hatte, wurde mir klar, dass es nach dem letzten Element eine Trennlinie zeichnete, was ärgerlich war. Daher habe ich Schritt 1 wie folgt geändert, um dieses Standardverhalten in DividerItemDecoration zu überschreiben (eine separate Klasse ist natürlich 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);
                }
            }
        }
);
24
gMale

Hier ist der Code für einen einfachen benutzerdefinierten Teiler (vertikaler Teiler/1 Punkt 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>
21
Tobliug

Ich denke, Sie verwenden Fragments, um RecyclerView zu haben

Fügen Sie diese Zeilen einfach hinzu, nachdem Sie Ihre Objekte RecyclerView und LayoutManager 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.

8
Vivek Maru

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 (your_file) unter Hauptaktivität wie folgt:

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

Probieren Sie diesen einfachen einzeiligen Code aus

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

Kotlin-Version:

recyclerview.addItemDecoration(DividerItemDecoration(this, LinearLayoutManager.VERTICAL))
6

Dies ist möglicherweise nicht der richtige Weg, aber ich habe der Einzelelementansicht von RecyclerView eine Ansicht 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 jeder Artikel eine Zeile hat, die ihn unten ausfüllt. Ich habe es mit einem #111111 Hintergrund ungefähr 1dp hoch gemacht. Dies gibt ihm auch eine Art "3D" -Effekt.

6
Smashing

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

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

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>

Teiler zu Recyclerview hinzufügen:

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

m den Teiler für das letzte Element zu entfernen:

Um das Zeichnen von Trennlinien für das letzte Element zu verhindern, 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:)

5
Bhuvanesh BS

yqritcs RecyclerView-FlexibleDivider macht dies zu einem Einzeiler. Fügen Sie dies zuerst zu Ihrem build.gradle hinzu:

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

Jetzt können Sie einen Verteiler 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());
3
Gaurav Vachhani

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

Fügen Sie der RecyclerView die gewünschte Hintergrundfarbe 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 Layoutstamm 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 1dp Abstand zwischen den Elementen und der Hintergrundfarbe von RecyclerView (die dunkelgrau als Teiler erscheinen würde) geben.

2
John Gummadi

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));
    }
}
1
Will Poitras

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

onCreateViewHolder

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

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

Wobei 0 Horizontal und 1 Vertikal ist

1
Freny Christian