Wyświetl listy z podziałem na strony

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 w PagedListAdapter 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

Ćwiczenia z programowania

Filmy

. .