Listen mit Seitennummern anzeigen

Dieses Handbuch baut auf der Paging Library auf und beschreibt, wie Sie Listen mit Informationen für Nutzer in der Benutzeroberfläche Ihrer App anzuzeigen, insbesondere wenn diese Änderungen an den Informationen.

UI mit Ihrem Ansichtsmodell verbinden

Sie können eine Verbindung LiveData<PagedList> in ein PagedListAdapter, wie gezeigt im folgenden Code-Snippet einfügen:

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);
    }
}

Da Datenquellen neue Instanzen PagedList, die Aktivität sendet diese Objekte an den Adapter senden. Die PagedListAdapter -Implementierung definiert, wie Aktualisierungen berechnet werden, und verarbeitet sie automatisch Paging und List diffing. Daher sind Ihre ViewHolder muss 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.
}

Die PagedListAdapter verarbeitet Seitenladeereignisse mithilfe einer PagedList.Callback -Objekt enthält. Wenn der Nutzer scrollt, ruft PagedListAdapter auf PagedList.loadAround() um Hinweise für die zugrunde liegende PagedList für welche Elemente aus dem DataSource

Differenzierten Callback implementieren

Im folgenden Beispiel sehen Sie eine manuelle Implementierung areContentsTheSame(), der relevante Objektfelder vergleicht:

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 Artikeln enthält, erkennt automatisch Änderungen an diesen Elementen, wenn ein neues PagedList-Objekt geladen. Daher löst der Adapter effiziente Elementanimationen innerhalb der RecyclerView-Objekt.

Unterschied bei Verwendung eines anderen Adaptertyps

Wenn Sie festlegen, dass PagedListAdapter – z. B. wenn Sie eine Bibliothek mit einem eigenen Adapter verwenden, können Sie weiterhin den Die unterschiedlichen Funktionen des Paging Library-Adapters können Sie direkt mit einem AsyncPagedListDiffer -Objekt enthält.

Platzhalter in Ihrer Benutzeroberfläche bereitstellen

Wenn Sie möchten, dass auf Ihrer Benutzeroberfläche eine Liste angezeigt wird, bevor die Anwendung fertig ist Abrufen von Daten können Sie Ihren Nutzern Platzhalterlistenelemente anzeigen. Die PagedList kümmert sich um diesen Fall Die Listenelementdaten werden als null dargestellt, bis die Daten geladen sind.

Platzhalter haben folgende Vorteile:

  • Unterstützung für Bildlaufleisten:Der PagedList gibt die Anzahl der die Elemente der Liste PagedListAdapter Dieses kann der Adapter eine Bildlaufleiste zeichnen, die die auf der Liste. Beim Laden neuer Seiten springt die Bildlaufleiste nicht, unverändert.
  • Kein Ladesymbol erforderlich:Da die Größe der Liste bereits bekannt ist, müssen Nutzende nicht darauf hingewiesen werden, dass weitere Elemente geladen werden. Die Platzhalter diese Informationen zu vermitteln.

Bevor Sie jedoch Unterstützung für Platzhalter hinzufügen, sollten Sie Folgendes beachten: Voraussetzungen erfüllen:

  • Erfordert ein zählbares Dataset: Instanzen von DataSource aus dem Raum Persistenzbibliothek effizient zählen, ihre Artikel. Wenn Sie eine benutzerdefinierte lokale Speicherlösung oder eine ausschließlich Netzwerk- Datenarchitektur, Es kann jedoch teuer oder sogar unmöglich sein, zu ermitteln, wie viele Artikel aus Ihrem Dataset besteht.
  • Für nicht geladene Elemente ist ein Adapter erforderlich: Der Adapter oder Präsentationsmechanismus, mit dem Sie die Liste für die Inflation erstellen, mit Null-Listenelementen umgehen. Wenn zum Beispiel Daten an eine ViewHolder, müssen Sie Standardwerte zur Darstellung nicht geladener Daten angeben.
  • Ansichten für gleich große Elemente erforderlich:Die Größe der Listenelemente kann sich je nach zum Beispiel Updates in sozialen Netzwerken oder das Überblenden von Inhalten sieht nicht gut aus. Wir empfehlen Ihnen dringend, die Platzhalter in diesem Fall zu deaktivieren.

Feedback geben

Wir freuen uns über dein Feedback und deine Ideen:

Problemverfolgung
Melde Probleme, damit wir sie beheben können.

Weitere Informationen

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

Produktproben

Codelabs

Videos