Oktober 2016 Update
Mit der Version 25.0.0 der Android Support Library wurde folgende DividerItemDecoration
Klasse eingeführt :
DividerItemDecoration ist eine RecyclerView.ItemDecoration, die als Teiler zwischen Elementen eines verwendet werden kann LinearLayoutManager
. Es unterstützt sowohl HORIZONTAL
als auch VERTICAL
Orientierungen.
Verwendungszweck:
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(),
layoutManager.getOrientation());
recyclerView.addItemDecoration(dividerItemDecoration);
Vorherige Antwort
Einige Antworten verwenden entweder Methoden, die inzwischen veraltet sind, oder geben keine vollständige Lösung an. Daher habe ich versucht, eine kurze, aktuelle Zusammenfassung zu erstellen.
Im Gegensatz dazu ListView
hat die RecyclerView
Klasse keine teilerbezogenen Parameter. Stattdessen müssen Sie erweitern ItemDecoration
, ein RecyclerView
‚s innere Klasse:
Mit ItemDecoration
ermöglicht die Anwendung, bestimmten Elementansichten aus dem Datensatz des Adapters einen speziellen Zeichnungs- und Layoutversatz hinzuzufügen. Dies kann nützlich sein, um Trennlinien zwischen Elementen, Markierungen, visuellen Gruppierungsgrenzen und mehr zu zeichnen.
Alle ItemDecorations
werden in der Reihenfolge gezeichnet sie hinzugefügt wurden, bevor die Artikel Ansichten (in onDraw()
) und nach den Punkten (in onDrawOver ( Canvas
, RecyclerView
, RecyclerView.State)
.
Vertical
Abstand ItemDecoration
Erweitern Sie ItemDecoration
, fügen Sie einen benutzerdefinierten Konstruktor hinzu, der Speicherplatz height
als Parameter verwendet, und überschreiben Sie die getItemOffsets()
Methode:
public class VerticalSpaceItemDecoration extends RecyclerView.ItemDecoration {
private final int verticalSpaceHeight;
public VerticalSpaceItemDecoration(int verticalSpaceHeight) {
this.verticalSpaceHeight = verticalSpaceHeight;
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
RecyclerView.State state) {
outRect.bottom = verticalSpaceHeight;
}
}
Wenn Sie kein Leerzeichen unter dem letzten Element einfügen möchten, fügen Sie die folgende Bedingung hinzu:
if (parent.getChildAdapterPosition(view) != parent.getAdapter().getItemCount() - 1) {
outRect.bottom = verticalSpaceHeight;
}
Hinweis: Sie können auch ändern outRect.top
, outRect.left
und outRect.right
Eigenschaften für die gewünschte Wirkung.
Teiler ItemDecoration
Verlängern ItemDecoration
und außer Kraft setzen onDraw()
Methode:
public class DividerItemDecoration extends RecyclerView.ItemDecoration {
private static final int[] ATTRS = new int[]{android.R.attr.listDivider};
private Drawable divider;
/**
* Default divider will be used
*/
public DividerItemDecoration(Context context) {
final TypedArray styledAttributes = context.obtainStyledAttributes(ATTRS);
divider = styledAttributes.getDrawable(0);
styledAttributes.recycle();
}
/**
* Custom divider will be used
*/
public DividerItemDecoration(Context context, int resId) {
divider = ContextCompat.getDrawable(context, resId);
}
@Override
public void onDraw(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 + divider.getIntrinsicHeight();
divider.setBounds(left, top, right, bottom);
divider.draw(c);
}
}
}
Sie können entweder den ersten Konstruktor aufrufen, der die Standardattribute für Android-Teiler verwendet, oder den zweiten Konstruktor, der Ihr eigenes Zeichenelement verwendet, z. B. drawable / 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="#ff992900" />
</shape>
Hinweis: Wenn Sie möchten, dass der Teiler über Ihre Elemente gezogen wird, überschreiben Sie onDrawOver()
stattdessen die Methode.
Verwendungszweck
So verwenden Sie Ihre neue Klasse add VerticalSpaceItemDecoration
oder DividerSpaceItemDecoration
to RecyclerView
, zum Beispiel in der onCreateView()
Methode Ihres Fragments :
private static final int VERTICAL_ITEM_SPACE = 48;
private RecyclerView recyclerView;
private LinearLayoutManager linearLayoutManager;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_feed, container, false);
recyclerView = (RecyclerView) rootView.findViewById(R.id.fragment_home_recycler_view);
linearLayoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(linearLayoutManager);
//add ItemDecoration
recyclerView.addItemDecoration(new VerticalSpaceItemDecoration(VERTICAL_ITEM_SPACE));
//or
recyclerView.addItemDecoration(new DividerItemDecoration(getActivity()));
//or
recyclerView.addItemDecoration(
new DividerItemDecoration(getActivity(), R.drawable.divider));
recyclerView.setAdapter(...);
return rootView;
}
Es gibt auch die Bibliothek von Lucas Rocha , die den Prozess der Artikeldekoration vereinfachen soll. Ich habe es aber nicht versucht.
Zu seinen Merkmalen gehören:
- Eine Sammlung von Dekorationen für Lagerartikel, darunter:
- Artikelabstand Horizontale / vertikale Teiler.
- Listenpunkt