RecyclerView, minimum grafik kaynağı kullanarak büyük miktarda veriyi görüntüleyebilir. Kullanıcılar bir RecyclerView içindeki öğeler arasında kaydırma yaparken, ekranın dışına kaydırılan öğelerin View
örnekleri, ekranda kaydırıldıkça yeni öğeler oluşturmak için yeniden kullanılır. Ancak cihaz döndürme gibi yapılandırma değişiklikleri, RecyclerView durumunu sıfırlayabilir ve kullanıcıları öğe listesinde önceki konumlarına tekrar kaydırmaya zorlayabilir.
RecyclerView, durumu (özellikle kaydırma konumu) ve liste öğelerinin durumunu tüm yapılandırma değişiklikleri sırasında korumalıdır.
Sonuçlar
RecyclerView, kaydırma konumunu ve RecyclerView listesindeki her öğenin durumunu geri yükleyebilir.
Sürüm uyumluluğu
Bu uygulama, tüm API düzeyleriyle uyumludur.
Bağımlılıklar
Yok.
Durumu koruma
RecyclerView.Adapter kaydırma konumunu kaydetmek için RecyclerView durum geri yükleme politikasını ayarlayın. RecyclerView liste öğelerinin durumunu kaydetme Liste öğelerinin durumunu RecyclerView bağdaştırıcısına ekleyin ve liste öğeleri bir ViewHolder'ye bağlandığında durumunu geri yükleyin.
1. Adapter durumunu geri yükleme politikasını etkinleştirme
RecyclerView bağdaştırıcısının durum geri yükleme politikasını etkinleştirerek RecyclerView öğesinin kaydırma konumunun yapılandırma değişiklikleri sırasında korunmasını sağlayın. Politika spesifikasyonunu bağdaştırıcı oluşturucuya ekleyin:
Kotlin
class MyAdapter() : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
init {
stateRestorationPolicy = StateRestorationPolicy.PREVENT_WHEN_EMPTY
}
...
}
Java
class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
public Adapter() {
setStateRestorationPolicy(StateRestorationPolicy.PREVENT_WHEN_EMPTY);
}
...
}
2. Durumlu liste öğelerinin durumunu kaydetme
RecyclerView öğelerini içeren öğeler gibi karmaşık RecyclerView liste öğelerinin durumunu kaydedin.EditText Örneğin, bir EditText durumunu kaydetmek için metin değişikliklerini yakalamak üzere onClick işleyicisine benzer bir geri çağırma ekleyin. Geri çağırma içinde hangi verilerin kaydedileceğini tanımlayın:
Kotlin
input.addTextChangedListener(
afterTextChanged = { text ->
text?.let {
// Save state here.
}
}
)
Java
input.addTextChangedListener(new TextWatcher() {
...
@Override
public void afterTextChanged(Editable s) {
// Save state here.
}
});
Geri aramayı Activity veya Fragment içinde bildirin. Durumu depolamak için ViewModel kullanın.
3. Adapter öğesine liste öğesi durumu ekleyin.
Liste öğelerinin durumunu RecyclerView.Adapter öğenize ekleyin. Ana makineniz Activity veya Fragment oluşturulduğunda öğe durumunu bağdaştırıcı oluşturucusuna iletin:
Kotlin
val adapter = MyAdapter(items, viewModel.retrieveState())
Java
MyAdapter adapter = new MyAdapter(items, viewModel.retrieveState());
4. Liste öğesi durumunu bağdaştırıcının ViewHolder içinde kurtarma
RecyclerView.Adapter içinde bir ViewHolder öğesini bir öğeye bağladığınızda öğenin durumunu geri yükleyin:
Kotlin
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
...
val item = items[position]
val state = states.firstOrNull { it.item == item }
if (state != null) {
holder.restore(state)
}
}
Java
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
...
Item item = items[position];
Arrays.stream(states).filter(state -> state.item == item)
.findFirst()
.ifPresent(state -> holder.restore(state));
}
Önemli noktalar
RecyclerView.Adapter#setStateRestorationPolicy(): BirRecyclerView.Adapteröğesinin yapılandırma değişikliğinden sonra durumunu nasıl geri yükleyeceğini belirtir.ViewModel: Bir etkinlik veya parça için durumu tutar.
Bu kılavuzu içeren koleksiyonlar
Bu kılavuz, daha kapsamlı Android geliştirme hedeflerini ele alan şu seçilmiş Hızlı Kılavuz koleksiyonlarının bir parçasıdır: