Ten przewodnik opiera się na bibliotece stron internetowych z opisem, jak prezentować w UI aplikacji listy informacji, zwłaszcza gdy zmian informacji.
Połącz interfejs z modelem widoku
Możesz połączyć instancję
LiveData<PagedList>
na
PagedListAdapter
, widoczne na ilustracji
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); } }
Ponieważ źródła danych dostarczają nowe instancje
PagedList
, aktywność wysyła
do adaptera.
PagedListAdapter
definiuje sposób zliczania aktualizacji i automatycznie
stronicowanie i listy. Dlatego
ViewHolder
wiąże się tylko z konkretnym podanym 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 wczytywania strony za pomocą
PagedList.Callback
obiektu. Gdy użytkownik przewija stronę, PagedListAdapter
wywołuje metodę
PagedList.loadAround()
.
aby przekazać wskazówki bazowemu
PagedList
jak
jakie elementy ma pobrać z
DataSource
.
Wdróż wywołanie zwrotne
Poniższy przykład pokazuje ręczną implementację
areContentsTheSame()
porównujący 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 produktów,
automatycznie wykrywa zmiany w tych elementach, gdy nowy obiekt PagedList
jest
wczytano. W rezultacie adapter uruchamia skuteczne animacje elementów w
RecyclerView
obiekt.
Różnice w przypadku użycia innego typu adaptera
Jeśli nie zdecydujesz się na dziedziczenie z
PagedListAdapter
– na przykład
jeśli używasz biblioteki z własnym adapterem – nadal możesz używać
Funkcjonalność adaptera biblioteki stron internetowych dzięki bezpośredniemu
AsyncPagedListDiffer
obiektu.
Umieść obiekty zastępcze w interfejsie
W przypadkach, gdy chcesz, aby interfejs wyświetlał listę przed zakończeniem działania aplikacji.
pobierania danych, możesz pokazać użytkownikom zastępcze elementy listy.
PagedList
zajmuje się tym zgłoszeniem przez
wyświetlanie danych elementu listy jako null
do czasu ich załadowania.
Symbole zastępcze mają te zalety:
- Obsługa pasków przewijania:
PagedList
podaje liczbę wyświetlać listę elementów wPagedListAdapter
Ten pozwalają na rysowanie paska przewijania z informacją o pełnym rozmiarze listę. Podczas wczytywania nowych stron pasek przewijania nie skacze, ponieważ lista nie zmienia rozmiaru. - Nie jest potrzebny wskaźnik postępu: rozmiar listy jest już znany, nie trzeba informować użytkowników o wczytywaniu kolejnych elementów. Zmienne samodzielnie przekazują te informacje.
Zanim dodasz obsługę zmiennych, pamiętaj, że: warunki wstępne:
- Wymaga policzonego zbioru danych: wystąpienia
DataSource
z sali biblioteka trwałości może skutecznie zliczać swoje produkty. Jeśli korzystasz z niestandardowego rozwiązania do przechowywania danych lokalnych lub sieci tylko architektura danych, jednak określenie liczby przedmiotów może być kosztowne, a nawet niemożliwe. tworzą zbiór danych. - Wymaga adaptera, aby uwzględnić wyładowane elementy: przejściówka lub
który służy do przygotowywania listy do inflacji
obsługuje puste elementy listy. Na przykład podczas wiązania danych z
ViewHolder
musisz podać wartości domyślne reprezentujące wyładowane dane. - Wymaga wyświetleń elementów o tym samym rozmiarze: jeśli rozmiary elementów listy mogą się zmieniać jego zawartość, np. aktualizacje w serwisach społecznościowych, przechodzenie pomiędzy elementami nie wygląda dobrze. W takim przypadku zdecydowanie zalecamy wyłączenie obiektów zastępczych.
Prześlij opinię
Podziel się z nami swoimi opiniami i pomysłami, korzystając z tych zasobów:
- Narzędzie do śledzenia błędów
- Zgłoś problemy, abyśmy mogli je naprawić.
Dodatkowe materiały
Więcej informacji o bibliotece stronicowania znajdziesz w poniższe zasoby.
Próbki
- Tworzenie stron dla komponentów architektury Androida fragment
- Strony internetowe z przykładową siecią
Ćwiczenia z programowania
Filmy
- Android Jetpack: zarządzaj nieskończonymi listami za pomocą funkcji RecyclerView i Paging (Google I/O 2018)
- Android Jetpack: stronicowanie
Polecane dla Ciebie
- Uwaga: tekst linku wyświetla się, gdy JavaScript jest wyłączony
- Omówienie biblioteki Paging 2
- Migracja do Paging 3
- Zbieranie danych według stron