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
- Android Jetpack: RecyclerView ve Paging ile sonsuz listeleri yönetin (Google I/O '18)
- Android Jetpack: Çağrı
Sizin için önerilenler
- Not: Bağlantı metni JavaScript kapalıyken gösterilir
- Sayfa 2 kitaplığına genel bakış
- 3. Sayfaya Geçiş
- Sayfalandırılmış verileri toplama