Sayfalı listeleri göster

Bu kılavuz, özellikle bu bilgiler değiştiğinde uygulamanızın kullanıcı arayüzünde kullanıcılara nasıl bilgi listesi sunabileceğinizi açıklayan çağrı kitaplığına genel bakış üzerine kurulmuştur.

Kullanıcı arayüzünüzü görünüm modelinize bağlama

Aşağıdaki kod snippet'inde gösterildiği gibi bir LiveData<PagedList> örneğini PagedListAdapter cihazına bağlayabilirsiniz:

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

Veri kaynakları yeni PagedList örnekleri sağladıkça, etkinlik bu nesneleri bağdaştırıcıya gönderir. PagedListAdapter uygulaması, güncellemelerin nasıl hesaplandığını tanımlar, sayfalandırmayı ve liste farklılıklarını otomatik olarak işler. Bu nedenle, ViewHolder öğenizin yalnızca belirli bir öğeye bağlanması gerekir:

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, sayfa yükleme etkinliklerini bir PagedList.Callback nesnesi kullanarak işler. Kullanıcı sayfayı kaydırırken PagedListAdapter, PagedList.loadAround() aracını çağırarak temel PagedList ile ilgili hangi öğelerin DataSource'ten getirileceğine dair ipuçları verir.

Farklı geri çağırmayı uygulayın

Aşağıdaki örnekte, alakalı nesne alanlarını karşılaştıran bir areContentsTheSame() manuel uygulaması gösterilmektedir:

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

Bağdaştırıcınız, öğe karşılaştırma tanımınızı içerdiğinden bağdaştırıcı, yeni bir PagedList nesnesi yüklendiğinde bu öğelerde yapılan değişiklikleri otomatik olarak algılar. Sonuç olarak bağdaştırıcı, RecyclerView nesnenizdeki verimli öğe animasyonlarını tetikler.

Farklı bir adaptör türü kullanma farkları

PagedListAdapter ürününden devralmamayı seçerseniz (örneğin, kendi bağdaştırıcısını sağlayan bir kitaplık kullanıyorsanız) doğrudan bir AsyncPagedListDiffer nesnesiyle çalışarak Çağrı Kitaplığı bağdaştırıcısının fark işlevini kullanabilirsiniz.

Kullanıcı arayüzünüzde yer tutucular sağlama

Kullanıcı arayüzünüzün, uygulamanızın veri getirme işlemini tamamlamadan liste göstermesini istediğiniz durumlarda kullanıcılarınıza yer tutucu liste öğeleri gösterebilirsiniz. Bu durumda PagedList, liste öğesi verilerini veriler yüklenene kadar null olarak sunar.

Yer tutucuların aşağıdaki avantajları vardır:

  • Kaydırma çubukları desteği: PagedList, PagedListAdapter'e liste öğelerinin sayısını belirtir. Bu bilgiler, bağdaştırıcının listenin tam boyutunu yansıtan bir kaydırma çubuğu çizmesine olanak tanır. Yeni sayfalar yüklenirken listenizin boyutu değişmediği için kaydırma çubuğu atlamaz.
  • Yükleme döner simgesi gerekli değil: Liste boyutu zaten bilindiği için kullanıcıları daha fazla öğenin yüklenmekte olduğu konusunda uyarmaya gerek yoktur. Yer tutucuların kendileri bu bilgiyi iletir.

Bununla birlikte, yer tutucular için destek eklemeden önce aşağıdaki ön koşulları aklınızda bulundurun:

  • Sayılandırılabilir veri kümesi gerektirir: Oda kalıcılığı kitaplığındaki DataSource örnekleri, öğelerini verimli bir şekilde sayabilir. Ancak özel bir yerel depolama çözümü veya yalnızca ağ veri mimarisi kullanıyorsanız veri kümenizin kaç öğe içerdiğini belirlemek pahalı olabilir, hatta imkansız olabilir.
  • Yüklenmemiş öğeleri hesaba katmak için bağdaştırıcı gerektirir: Listeyi enflasyona hazırlamak için kullandığınız bağdaştırıcı veya sunu mekanizmasının boş liste öğelerini işlemesi gerekir. Örneğin, verileri bir ViewHolder öğesine bağlarken yüklenmemiş verileri temsil etmek için varsayılan değerler sağlamanız gerekir.
  • Aynı boyutta öğe görüntülemesi gerektirir: Liste öğesi boyutları, içeriklerine göre (sosyal ağ güncellemeleri gibi) değişebiliyorsa öğeler arasında geçiş iyi görünmez. Bu durumda yer tutucuların devre dışı bırakılmasını önemle tavsiye ederiz.

Geri bildirim gönderme

Aşağıdaki kaynakları kullanarak geri bildirimlerinizi ve fikirlerinizi bizimle paylaşabilirsiniz:

Sorun izleyici
Hataları düzeltebilmemiz için sorunları bildirin.

Ek kaynaklar

Sayfalama Kitaplığı hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın.

Sana Özel

Codelab uygulamaları

Videolar