Ein RecyclerView ermöglicht die effiziente Darstellung großer Datenmengen. Um Daten in einem RecyclerView anzuzeigen, müssen Sie zwei Dinge tun:
- Mehrere Daten-Items müssen als Liste zur Verfügung gestellt werden.
- Für die Anzeige eines Daten-Items muss ein Layout festgelegt werden.
Der
RecyclerViewverwendet (recycelt) pro Daten-Item das definierte Layout und zeigt es an. Wenn ein Daten-Item vom Bildschirm gescrollt wird, zerstört derRecyclerViewseine Darstellung nicht. Stattdessen wird das Layout für neue, nun sichtbare Elemente wiederverwendet. Diese Wiederverwendung verbessert die Leistung und die Reaktionsfähigkeit Ihrer App erheblich und reduziert so den Stromverbrauch.
Wichtige Klassen
Folgende Klassen arbeiten zusammen, damit der RecyclerView die Daten dynamisch anzeigen kann:
- Der RecyclerView ist das Widget, das die einzelnen Daten-Items mit dem Detail-Layout anzeigt. Der
RecyclerViewerbt von der KlasseViewGroup. Die KlasseRecyclerViewkann also wie einViewverwendet werden. Ziehen Sie denRecyclerVieweinfach auf eine Aktivität. - Die Adapter-Klasse (EanAdapter) enthält als innere Klasse eine projektspezifische
ViewHolderKlasse(EanViewHolder) . DieViewHolder-Klasse erbt vonRecyclerView.ViewHolder - Die Adapter-Klasse selbst erbt von:
RecyclerView.Adapter<EanAdapter.EanViewHolder> - Jedes einzelne Daten-Item wird nun durch ein spezielles
ViewHolder-Objekt eingepackt und imRecyclerViewangezeigt. - Für die Darstellung der einzelnen Daten-Items wird dem
RecyclerViewein Layout-Manager zugeordnet.
Beispiel
Layout
/res/layout/activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/itemTextSelected"
android:layout_width="285dp"
android:layout_height="26dp"
android:layout_marginTop="40dp"
android:text="itemTextSelected"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/itemValueSelected"
android:layout_width="234dp"
android:layout_height="22dp"
android:layout_marginTop="20dp"
android:text="itemValueSelected"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.497"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/itemTextSelected" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/RecyclerView"
android:layout_width="376dp"
android:layout_height="250dp"
android:layout_marginTop="80dp"
android:background="#FFFFFF"
app:layout_constraintTop_toBottomOf="@+id/itemValueSelected"
tools:layout_editor_absoluteX="17dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>/res/layout/item_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/itemText"
android:layout_width="218dp"
android:layout_height="18dp"
android:text="Text"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/itemValue"
android:layout_width="216dp"
android:layout_height="23dp"
android:text="Value"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/itemText" />
</androidx.constraintlayout.widget.ConstraintLayout>RecyclerViewListener
/app/…/RecyclerViewListener
public interface RecyclerViewListener {
void onItemSelected(int position);
}ItemEntity
/app/…/ItemEntity
public class ItemEntity {
private String text;
private String value;
public ItemEntity(String text, String value) {
this.text = text;
this.value = value;
}
public String getText() {return text; }
public void setText(String text) {this.text = text;}
public String getValue() {return value;}
public void setValue(String value) {this.value = value;}
}AdapterClass
/app/…/AdapterClass
import de.ts.btin2.recyclerviewuebungka.databinding.ItemLayoutBinding;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
public class AdapterClass extends RecyclerView.Adapter<AdapterClass.ViewHolder>{
private List<ItemEntity> itemList;
private RecyclerViewListener listener;
public AdapterClass(List<ItemEntity> itemList, RecyclerViewListener listener) {
this.listener = listener;
this.itemList = itemList;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ItemLayoutBinding binding;
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
binding = ItemLayoutBinding.inflate(inflater,parent,false);
return new ViewHolder(binding,listener);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
//Daten-Objekt aus Liste ermitteln
ItemEntity item = itemList.get(position);
//Werte des Datenobjektes in ViewHolder-Objekt schreiben
holder.binding.itemText.setText(item.getText());
holder.binding.itemValue.setText(item.getValue());
}
@Override
public int getItemCount() {
return itemList == null ? 0 : itemList.size();
}
static class ViewHolder extends RecyclerView.ViewHolder {
ItemLayoutBinding binding;
//Konstruktor
ViewHolder(ItemLayoutBinding binding, RecyclerViewListener listener) {
super(binding.getRoot());
this.binding = binding;
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
listener.onItemSelected(getAdapterPosition());
}
});
}
}
}MainActivity
/app/…/MainActivity
import android.os.Bundle;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import java.util.ArrayList;
import de.ts.btin2.recyclerviewuebungka.databinding.ActivityMainBinding;
public class MainActivity extends AppCompatActivity {
private ActivityMainBinding binding;
private ArrayList<ItemEntity> itemList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
itemList.add(new ItemEntity("a", "1"));
itemList.add(new ItemEntity("b", "2"));
itemList.add(new ItemEntity("c", "3"));
binding.RecyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
RecyclerViewListener listener = new RecyclerViewListener() {
@Override
public void onItemSelected(int position) {
ItemEntity item = itemList.get(position);
binding.itemTextSelected.setText(item.getText());
binding.itemValueSelected.setText(item.getValue());
}
};
binding.RecyclerView.setAdapter(new AdapterClass(itemList,listener));
}
}