Erste Schritte mit RecyclerView und CardView auf Android
German (Deutsch) translation by Jenyia (you can also view the original English article)
Wenn Sie daran interessiert sind, eine Android-App zu erstellen, die Listen zum Anzeigen von Daten verwendet, bietet Android Lollipop zwei neue Widgets, die Ihnen das Leben erleichtern werden: RecyclerView und CardView. Mit diesen Widgets ist es sehr einfach, Ihrer App ein Look-and-Feel zu geben, das den in der Materialdesign-Spezifikation von Google genannten Richtlinien entspricht.
Voraussetzungen
Um zu folgen, sollten Sie die neueste Version von Android Studio verwenden. Sie können es von der Android Developer Website erhalten.
1. Unterstützung der ältere Versionen
Zum Zeitpunkt des Schreibens haben weniger als 2% der Android-Geräte Android Lollipop. Dank der Support-Bibliothek von v7 können Sie die RecyclerView- und CardView-Widgets auf Geräten verwenden, auf denen ältere Versionen von Android ausgeführt werden, indem Sie die folgenden Zeilen zum Abschnitt Abhängigkeiten in der Datei build.grade Ihres Projekts hinzufügen:
1 | compile 'com.android.support:cardview-v7:21.0.+' |
2 | compile 'com.android.support:recyclerview-v7:21.0.+' |
2. Erstellung eines CardView
Ein CardView ist eine ViewGroup. Wie jede andere ViewGroup kann sie mit einer XML-Layoutdatei zu Ihrer Activity oder Ihrem Fragment hinzugefügt werden.
Um ein leeres CardView zu erstellen, müssten Sie Ihrem Layout-XML den folgenden Code hinzufügen, wie im folgenden Code-Schnipsel gezeigt:
1 | <android.support.v7.widget.CardView |
2 | xmlns:card_view="http://schemas.android.com/apk/res-auto" |
3 | android:layout_width="match_parent" |
4 | android:layout_height="wrap_content"> |
5 | |
6 | </android.support.v7.widget.CardView> |
Als ein realistischeres Beispiel erstellen wir jetzt ein LinearLayout und platzieren ein CardView darin. Die CardView könnte beispielsweise eine Person darstellen und Folgendes enthalten:
- ein
TextView, um den Namen der Person anzuzeigen - ein
TextView, um das Alter der Person anzuzeigen - ein
ImageView, um das Foto der Person anzuzeigen
So würde das XML aussehen:
1 | <?xml version="1.0" encoding="utf-8"?> |
2 | <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" |
3 | android:layout_width="match_parent" android:layout_height="match_parent" |
4 | android:padding="16dp" |
5 | > |
6 | |
7 | <android.support.v7.widget.CardView |
8 | android:layout_width="match_parent" |
9 | android:layout_height="wrap_content" |
10 | android:id="@+id/cv" |
11 | > |
12 | |
13 | <RelativeLayout |
14 | android:layout_width="match_parent" |
15 | android:layout_height="wrap_content" |
16 | android:padding="16dp" |
17 | > |
18 | |
19 | <ImageView |
20 | android:layout_width="wrap_content" |
21 | android:layout_height="wrap_content" |
22 | android:id="@+id/person_photo" |
23 | android:layout_alignParentLeft="true" |
24 | android:layout_alignParentTop="true" |
25 | android:layout_marginRight="16dp" |
26 | /> |
27 | |
28 | <TextView |
29 | android:layout_width="wrap_content" |
30 | android:layout_height="wrap_content" |
31 | android:id="@+id/person_name" |
32 | android:layout_toRightOf="@+id/person_photo" |
33 | android:layout_alignParentTop="true" |
34 | android:textSize="30sp" |
35 | /> |
36 | |
37 | <TextView |
38 | android:layout_width="wrap_content" |
39 | android:layout_height="wrap_content" |
40 | android:id="@+id/person_age" |
41 | android:layout_toRightOf="@+id/person_photo" |
42 | android:layout_below="@+id/person_name" |
43 | /> |
44 | |
45 | </RelativeLayout> |
46 | |
47 | </android.support.v7.widget.CardView> |
48 | |
49 | </LinearLayout> |
Wenn dieser XML-Code als Layout einer Activity verwendet wird und die TextView- und ImageView-Felder auf sinnvolle Werte festgelegt sind, wird dies auf einem Android-Gerät so dargestellt:



3. Erstellung einer RecyclerView
Schritt 1: Definieren Sie es in einem Layout
Die Verwendung einer RecyclerView-Instanz ist etwas komplizierter. Es ist jedoch sehr einfach, es in einer XML-Layoutdatei zu definieren. Sie können es in einem Layout wie folgt definieren:
1 | <android.support.v7.widget.RecyclerView |
2 | android:layout_width="match_parent" |
3 | android:layout_height="match_parent" |
4 | android:id="@+id/rv" |
5 | /> |
Verwenden Sie das folgende Snippet, um in Ihrer Activity ein Handle zu erhalten:
1 | RecyclerView rv = (RecyclerView)findViewById(R.id.rv); |
Wenn Sie sicher sind, dass sich die Größe von RecyclerView nicht ändert, können Sie Folgendes hinzufügen, um die Leistung zu verbessern:
1 | rv.setHasFixedSize(true); |
Schritt 2: Verwendung eines LayoutManagers
Im Gegensatz zu einem ListView benötigt ein RecyclerView einen LayoutManager, um die Positionierung seiner Elemente zu verwalten. Sie könnten Ihren eigenen LayoutManager definieren, indem Sie die RecyclerView.LayoutManager-Klasse erweitern. In den meisten Fällen können Sie jedoch einfach eine der vordefinierten LayoutManager-Unterklassen verwenden:
LinearLayoutManagerGridLayoutManager-
StaggeredGridLayoutManager
In diesem Tutorial werde ich einen LinearLayoutManager verwenden. Diese LayoutManager-Unterklasse lässt Ihr RecyclerView standardmäßig wie ein ListView aussehen.
1 | LinearLayoutManager llm = new LinearLayoutManager(context); |
2 | rv.setLayoutManager(llm); |
Schritt 3: Definieren der Daten
Genau wie ein ListView benötigt ein RecyclerView einen Adapter, um auf seine Daten zugreifen zu können. Aber bevor wir einen Adapter erstellen, erstellen wir Daten, mit denen wir arbeiten können. Erstellen Sie eine einfache Klasse, um eine Person darzustellen, und schreiben Sie dann eine Methode zum Initialisieren einer Liste von Person objekten:
1 | class Person { |
2 | String name; |
3 | String age; |
4 | int photoId; |
5 | |
6 | Person(String name, String age, int photoId) { |
7 | this.name = name; |
8 | this.age = age; |
9 | this.photoId = photoId; |
10 | } |
11 | } |
12 | |
13 | private List<Person> persons; |
14 | |
15 | // This method creates an ArrayList that has three Person objects |
16 | // Checkout the project associated with this tutorial on Github if |
17 | // you want to use the same images. |
18 | private void initializeData(){ |
19 | persons = new ArrayList<>(); |
20 | persons.add(new Person("Emma Wilson", "23 years old", R.drawable.emma)); |
21 | persons.add(new Person("Lavery Maiss", "25 years old", R.drawable.lavery)); |
22 | persons.add(new Person("Lillie Watts", "35 years old", R.drawable.lillie)); |
23 | } |
Tipp 4: Erstellung eines Adapters
Um einen Adapter zu erstellen, den ein RecyclerView verwenden kann, müssen Sie RecyclerView.Adapter erweitern. Dieser Adapter folgt dem Entwurfsmuster des Ansichtshalters, was bedeutet, dass Sie eine benutzerdefinierte Klasse definieren, die RecyclerView.ViewHolder erweitert. Dieses Muster minimiert die Anzahl der Aufrufe der kostspieligen findViewById-Methode.
In diesem Tutorial haben wir bereits das XML-Layout für ein CardView definiert, das eine Person darstellt. Wir werden dieses Layout jetzt wiederverwenden. Konstruieren Sie im Konstruktor unseres benutzerdefinierten ViewHolders die Ansichten, die zu den Elementen unseres RecyclerView gehören.
1 | public class RVAdapter extends RecyclerView.Adapter<RVAdapter.PersonViewHolder>{ |
2 | |
3 | public static class PersonViewHolder extends RecyclerView.ViewHolder { |
4 | CardView cv; |
5 | TextView personName; |
6 | TextView personAge; |
7 | ImageView personPhoto; |
8 | |
9 | PersonViewHolder(View itemView) { |
10 | super(itemView); |
11 | cv = (CardView)itemView.findViewById(R.id.cv); |
12 | personName = (TextView)itemView.findViewById(R.id.person_name); |
13 | personAge = (TextView)itemView.findViewById(R.id.person_age); |
14 | personPhoto = (ImageView)itemView.findViewById(R.id.person_photo); |
15 | } |
16 | } |
17 | |
18 | } |
Als Nächstes fügen Sie dem benutzerdefinierten Adapter einen Konstruktor hinzu, so dass er ein Handle für die Daten aufweist, die von der RecyclerView angezeigt werden. Da unsere Daten in Form einer List von Person objekten vorliegen, verwenden Sie den folgenden Code:
1 | List<Person> persons; |
2 | |
3 | RVAdapter(List<Person> persons){ |
4 | this.persons = persons; |
5 | } |
RecyclerView.Adapter hat drei abstrakte Methoden, die wir überschreiben müssen. Beginnen wir mit der Methode getItemCount. Das sollte die Anzahl der in den Daten vorhandenen Elemente zurückgeben. Da unsere Daten in Form einer List vorliegen, müssen wir nur die size methode für das List-Objekt aufrufen:
1 | @Override |
2 | public int getItemCount() { |
3 | return persons.size(); |
4 | } |
Als nächstes überschreiben Sie die onCreateViewHolder-Methode. Wie der Name schon sagt, wird diese Methode aufgerufen, wenn der benutzerdefinierte ViewHolder initialisiert werden muss. Wir legen das Layout fest, das jedes Element von RecyclerView verwenden soll. Es geschieht durch Aufblasen des Layouts mit LayoutInflater und Übergeben der Ausgabe an den Konstruktor des benutzerdefinierten ViewHolders.
1 | @Override |
2 | public PersonViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { |
3 | View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, viewGroup, false); |
4 | PersonViewHolder pvh = new PersonViewHolder(v); |
5 | return pvh; |
6 | } |
Überschreiben Sie den onBindViewHolder, um den Inhalt jedes Elements von RecyclerView anzugeben. Diese Methode ist der getView-Methode eines ListView-Adapters sehr ähnlich. In unserem Beispiel müssen Sie hier die Werte für den Namen, das Alter und die Fotofelder von CardView festlegen.
1 | @Override |
2 | public void onBindViewHolder(PersonViewHolder personViewHolder, int i) { |
3 | personViewHolder.personName.setText(persons.get(i).name); |
4 | personViewHolder.personAge.setText(persons.get(i).age); |
5 | personViewHolder.personPhoto.setImageResource(persons.get(i).photoId); |
6 | } |
Schließlich müssen Sie die onAttachedToRecyclerView-Methode überschreiben. Fürs Erste können wir einfach die Implementierung der Superklasse wie unten gezeigt verwenden.
1 | @Override |
2 | public void onAttachedToRecyclerView(RecyclerView recyclerView) { |
3 | super.onAttachedToRecyclerView(recyclerView); |
4 | } |
Schritt 5: Verwendung des Adapters
Nun, da der Adapter bereit ist, fügen Sie Ihrer Activity den folgenden Code hinzu, um den Adapter zu initialisieren und zu verwenden, indem Sie den Konstruktor des Adapters und die Methode setAdapter von RecyclerView aufrufen:
1 | RVAdapter adapter = new RVAdapter(persons); |
2 | rv.setAdapter(adapter); |
Schritt 6: Kompilieren und Ausführen
Wenn Sie das RecyclerView-Beispiel auf einem Android-Gerät ausführen, sollten Sie etwas Ähnliches wie das folgende sehen.



Schlussfolgerung
In diesem Tutorial haben Sie gelernt, wie Sie die CardView- und RecyclerView-Widgets verwenden, die in Android Lollipop eingeführt wurden. Sie haben auch Beispiele dafür gesehen, wie Sie diese Widgets in Material Design-Apps verwenden können. Beachten Sie, dass, obwohl ein RecyclerView fast alles kann, was ein ListView kann, für kleine Datensätze die Verwendung eines ListViews immer noch vorzuziehen ist, da weniger Codezeilen benötigt werden.
Weitere Informationen zu den Klassen CardView und RecyclerView finden Sie in der Android Developers Reference.



