Listen mit Seitennummern anzeigen

Dieser Leitfaden baut auf der Übersicht der Paging-Bibliothek auf. Darin wird beschrieben, wie Sie Listen mit Informationen für Nutzer in der Benutzeroberfläche Ihrer App präsentieren können, insbesondere wenn sich diese Informationen ändern.

UI mit dem Ansichtsmodell verbinden

Sie können eine Instanz von LiveData<PagedList> mit einem PagedListAdapter verbinden, wie im folgenden Code-Snippet gezeigt:

Kotlin

class ConcertActivity : AppCompatActivity() {
    private val adapter = ConcertAdapter()

    // Use the 'by viewModels()' Kotlin property delegate
    // from the activity-ktx artifact
    private val viewModel: ConcertViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState);
        viewModel.concerts.observe(this, Observer { adapter.submitList(it) })
    }
}

Java

public class ConcertActivity extends AppCompatActivity {
    private ConcertAdapter adapter = new ConcertAdapter();
    private ConcertViewModel viewModel;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        viewModel = new ViewModelProvider(this).get(ConcertViewModel.class);
        viewModel.concertList.observe(this, adapter::submitList);
    }
}

Wenn Datenquellen neue Instanzen von PagedList bereitstellen, sendet die Aktivität diese Objekte an den Adapter. Die PagedListAdapter-Implementierung definiert, wie Aktualisierungen berechnet werden, und handhabt Seiten- und Listenunterschiede automatisch. Daher muss Ihr ViewHolder nur an ein bestimmtes bereitgestelltes Element gebunden werden:

Kotlin

class ConcertAdapter() :
        PagedListAdapter<Concert, ConcertViewHolder>(DIFF_CALLBACK) {
    override fun onBindViewHolder(holder: ConcertViewHolder, position: Int) {
        val concert: Concert? = getItem(position)

        // Note that "concert" is a placeholder if it's null.
        holder.bindTo(concert)
    }

    companion object {
        private val DIFF_CALLBACK = ... // See Implement the diffing callback section.
    }
}

Java

public class ConcertAdapter
        extends PagedListAdapter<Concert, ConcertViewHolder> {
    protected ConcertAdapter() {
        super(DIFF_CALLBACK);
    }

    @Override
    public void onBindViewHolder(@NonNull ConcertViewHolder holder,
            int position) {
        Concert concert = getItem(position);

        // Note that "concert" can be null if it's a placeholder.
        holder.bindTo(concert);
    }

    private static DiffUtil.ItemCallback<Concert> DIFF_CALLBACK
            = ... // See Implement the diffing callback section.
}

Der PagedListAdapter verarbeitet Ereignisse zum Seitenaufbau mit einem PagedList.Callback-Objekt. Wenn der Nutzer scrollt, ruft PagedListAdapter PagedList.loadAround() auf, um dem zugrunde liegenden PagedList Hinweise dazu zu geben, welche Elemente aus DataSource abgerufen werden sollen.

Differenzierenden Callback implementieren

Das folgende Beispiel zeigt eine manuelle Implementierung von areContentsTheSame(), mit der relevante Objektfelder verglichen werden:

Kotlin

private val DIFF_CALLBACK = object : DiffUtil.ItemCallback<Concert>() {
    // The ID property identifies when items are the same.
    override fun areItemsTheSame(oldItem: Concert, newItem: Concert) =
            oldItem.id == newItem.id

    // If you use the "==" operator, make sure that the object implements
    // .equals(). Alternatively, write custom data comparison logic here.
    override fun areContentsTheSame(
            oldItem: Concert, newItem: Concert) = oldItem == newItem
}

Java

private static DiffUtil.ItemCallback<Concert> DIFF_CALLBACK =
        new DiffUtil.ItemCallback<Concert>() {

    @Override
    public boolean areItemsTheSame(Concert oldItem, Concert newItem) {
        // The ID property identifies when items are the same.
        return oldItem.getId() == newItem.getId();
    }

    @Override
    public boolean areContentsTheSame(Concert oldItem, Concert newItem) {
        // Don't use the "==" operator here. Either implement and use .equals(),
        // or write custom data comparison logic here.
        return oldItem.equals(newItem);
    }
};

Da der Adapter Ihre Definition für den Vergleich von Elementen enthält, erkennt er automatisch Änderungen an diesen Elementen, wenn ein neues PagedList-Objekt geladen wird. Daher löst der Adapter effiziente Elementanimationen im RecyclerView-Objekt aus.

Unterschiede mit einem anderen Adaptertyp

Wenn Sie keine Daten von PagedListAdapter übernehmen möchten, z. B. wenn Sie eine Bibliothek mit einem eigenen Adapter verwenden, können Sie die Differenzfunktion des Paging Library-Adapters dennoch direkt mit einem AsyncPagedListDiffer-Objekt verwenden.

Platzhalter in Ihrer Benutzeroberfläche angeben

Wenn auf der Benutzeroberfläche eine Liste angezeigt werden soll, bevor die App das Abrufen von Daten abgeschlossen hat, können Sie Ihren Nutzern Platzhalterlistenelemente anzeigen lassen. Der PagedList verarbeitet diesen Fall, indem die Listenelementdaten als null dargestellt werden, bis die Daten geladen sind.

Platzhalter haben folgende Vorteile:

  • Unterstützung für Bildlaufleisten:PagedList gibt die Anzahl der Listenelemente an die PagedListAdapter an. Mit dieser Information kann der Adapter eine Bildlaufleiste zeichnen, die die vollständige Größe der Liste darstellt. Beim Laden neuer Seiten springt die Bildlaufleiste nicht, weil sich die Größe der Liste nicht ändert.
  • Kein rotierendes Ladesymbol erforderlich:Da die Listengröße bereits bekannt ist, müssen die Nutzer nicht benachrichtigt werden, dass weitere Elemente geladen werden. Die Platzhalter vermitteln diese Informationen.

Bevor Sie jedoch Platzhalter hinzufügen, müssen Sie die folgenden Voraussetzungen erfüllen:

  • Erfordert einen zählbaren Datensatz:Bei Instanzen von DataSource aus der Raumpersistenzbibliothek können die Elemente effizient gezählt werden. Wenn Sie eine benutzerdefinierte lokale Speicherlösung oder eine ausschließliche Netzwerkdatenarchitektur verwenden, kann es jedoch teuer oder sogar unmöglich sein, zu ermitteln, wie viele Elemente Ihr Dataset umfasst.
  • Adapter zur Berücksichtigung nicht geladener Elemente erforderlich:Der Adapter oder der Darstellungsmechanismus, den Sie zur Vorbereitung der Liste für die Inflation verwenden, muss Null-Listenelemente verarbeiten können. Wenn Sie beispielsweise Daten an eine ViewHolder binden, müssen Sie Standardwerte zur Darstellung nicht geladener Daten angeben.
  • Erfordert Aufrufe gleicher Größe:Wenn sich die Größe der Listenelemente basierend auf ihrem Inhalt ändern kann (z. B. bei Updates in sozialen Netzwerken), macht das Überblenden zwischen Elementen nicht gut aus. In diesem Fall sollten Sie die Platzhalter unbedingt deaktivieren.

Feedback geben

Teilen Sie uns Ihr Feedback und Ihre Ideen über diese Ressourcen mit:

Problemverfolgung
Melden Sie Probleme, damit wir sie beheben können.

Weitere Informationen

Weitere Informationen zur Paging Library finden Sie in den folgenden Ressourcen.

Produktproben

Codelabs

Videos