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, tüm yapılandırma değişiklikleri sırasında durumunu (özellikle kaydırma konumu) ve liste öğelerinin durumunu 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 durumunu geri yükleme politikasını ayarlayarak RecyclerView kaydırma konumunu kaydedin. 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 liste öğelerinin durumunu geri yükleyin.
1. Adapter durumunu geri yükleme politikasını etkinleştirin.
RecyclerView adaptörünün durum geri yükleme politikasını etkinleştirin. Böylece, RecyclerView öğesinin kaydırma konumu yapılandırma değişiklikleri boyunca korunur. 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. Durum bilgili liste öğelerinin durumunu kaydetme
EditText öğeleri içeren öğeler gibi karmaşık RecyclerView liste öğelerinin durumunu kaydedin. Ö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şlevi 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 çağırmayı Activity veya Fragment içinde tanımlayın. 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. Adaptörün ViewHolder içinde liste öğesi durumunu 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 rehberi 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: