Ten dokument stanowi uzupełnienie omówienia biblioteki Paging i opisuje, jak możesz prezentować listy informacji użytkownikom w interfejsie aplikacji, zwłaszcza gdy te informacje się zmieniają.
Łączenie interfejsu z modelem widoku
Możesz połączyć instancję LiveData<PagedList> z PagedListAdapter, jak pokazano w tym fragmencie kodu:
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);
}
}
Gdy źródła danych dostarczają nowe instancje PagedList, aktywność wysyła te obiekty do adaptera. Implementacja PagedListAdapter określa, jak są obliczane aktualizacje, i automatycznie obsługuje stronicowanie oraz różnicowanie list.
Dlatego ViewHolder musi być powiązany tylko z konkretnym udostępnionym elementem:
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.
}
PagedListAdapter obsługuje zdarzenia wczytania strony za pomocą obiektu PagedList.Callback. Gdy użytkownik przewija stronę, PagedListAdapter wywołuje PagedList.loadAround(), aby przekazać do PagedList wskazówki dotyczące tego, które elementy należy pobrać z DataSource.
Implementowanie wywołania zwrotnego porównania
Poniższy przykład pokazuje ręczną implementację metody areContentsTheSame(), która porównuje odpowiednie pola obiektów:
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);
}
};
Ponieważ adapter zawiera definicję porównywania elementów, automatycznie wykrywa zmiany w tych elementach po załadowaniu nowego obiektu PagedList. W efekcie adapter wywołuje wydajne animacje elementów w obiekcie RecyclerView.
Porównywanie przy użyciu innego typu adaptera
Jeśli nie chcesz dziedziczyć po PagedListAdapter – na przykład gdy używasz biblioteki, która udostępnia własny adapter – nadal możesz korzystać z funkcji porównywania adaptera biblioteki stronicowania, pracując bezpośrednio z obiektem AsyncPagedListDiffer.
Używaj obiektów zastępczych w interfejsie
Jeśli chcesz, aby interfejs wyświetlał listę, zanim aplikacja zakończy pobieranie danych, możesz wyświetlić użytkownikom elementy listy zastępczej. PagedList obsługuje ten przypadek, wyświetlając dane produktu jako null, dopóki dane nie zostaną załadowane.
Obiekty zastępcze mają te zalety:
- Obsługa pasków przewijania:
PagedListpodaje liczbę elementów listy doPagedListAdapter. Dzięki tym informacjom adapter może narysować pasek przewijania, który odzwierciedla pełny rozmiar listy. Podczas wczytywania nowych stron pasek przewijania nie przeskakuje, ponieważ rozmiar listy się nie zmienia. - Nie jest potrzebny wskaźnik ładowania: ponieważ rozmiar listy jest już znany, nie trzeba informować użytkowników, że ładuje się więcej elementów. Same obiekty zastępcze przekazują te informacje.
Zanim jednak dodasz obsługę obiektów zastępczych, pamiętaj o tych warunkach wstępnych:
- Wymaga policzalnego zbioru danych: instancje
DataSourcez biblioteki trwałości danych Room mogą skutecznie zliczać elementy. Jeśli jednak używasz niestandardowego rozwiązania do przechowywania danych lokalnie lub architektury danych opartej wyłącznie na sieci, określenie liczby elementów tworzących zbiór danych może być kosztowne lub nawet niemożliwe. - Wymaga adaptera do obsługi niezaładowanych elementów: adapter lub mechanizm prezentacji, którego używasz do przygotowania listy do wypełnienia, musi obsługiwać elementy listy o wartości null. Na przykład podczas wiązania danych z elementem
ViewHoldermusisz podać wartości domyślne, które będą reprezentować niewczytane dane. - Wymaga widoków elementów o tym samym rozmiarze: jeśli rozmiary elementów listy mogą się zmieniać w zależności od ich zawartości, np. aktualizacji w sieciach społecznościowych, przenikanie między elementami nie wygląda dobrze. W takim przypadku zdecydowanie zalecamy wyłączenie obiektów zastępczych.
Prześlij opinię
Podziel się z nami swoją opinią i pomysłami, korzystając z tych materiałów:
- Narzędzie Issue Tracker

- Zgłaszaj problemy, abyśmy mogli naprawić błędy.
Dodatkowe materiały
Więcej informacji o bibliotece Paging znajdziesz w tych materiałach.
Przykłady
Codelabs
Filmy
- Android Jetpack: manage infinite lists with RecyclerView and Paging (Google I/O '18)
- Android Jetpack: Paging
Polecane dla Ciebie
- Uwaga: tekst linku jest wyświetlany, gdy język JavaScript jest wyłączony.
- Omówienie biblioteki Paging 2
- Migracja do Paging 3
- Zbieranie danych ze stron