RecyclerView
, minimum düzeyde grafik kaynakları kullanarak büyük miktarda veri görüntüleyebilir. Kullanıcılar bir RecyclerView
'teki öğeler arasında gezinirken View
, ekrandan kaydırılan öğe örnekleri, ekranda kaydırırken yeni öğeler oluşturmak için yeniden kullanılır. Ancak cihaz döndürme gibi yapılandırma değişiklikleri, RecyclerView
öğesinin durumunu sıfırlayabilir ve kullanıcıları öğe listesindeki önceki konumlarına tekrar kaydırmaya zorlayabilir.
RecyclerView
, tüm yapılandırma değişiklikleri sırasında durumunu (özellikle de kaydırma konumunu) ve liste öğelerinin durumunu korumalıdır.
Durumu koruma
RecyclerView
kaydırma konumunu kaydetmek için RecyclerView.Adapter
'ün durum geri yükleme politikasını ayarlayın. RecyclerView
liste öğelerinin durumunu kaydedin. Liste öğelerinin durumunu RecyclerView
bağdaştırıcısı'na ekleyin ve bir ViewHolder
'ye bağlandığında liste öğelerinin durumunu geri yükleyin.
1. Adapter
durum geri yükleme politikasını etkinleştirme
RecyclerView
adaptörünün durum geri yükleme politikasını etkinleştirerek RecyclerView
'ün kaydırma konumunun yapılandırma değişikliklerinde 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. Durum bilgisine sahip liste öğelerinin durumunu kaydetme
EditText
öğeleri içeren öğeler gibi karmaşık RecyclerView
liste öğelerinin durumunu kaydedin. Örneğin, bir EditText
öğesinin durumunu kaydetmek için metin değişikliklerini yakalamak üzere onClick
işleyicisine benzer bir geri çağırma işlevi 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 çağırma işlevini Activity
veya Fragment
öğeniz içinde tanımlayın. Durumu depolamak için bir ViewModel
kullanın.
3. Adapter
Liste öğelerinin durumunu RecyclerView.Adapter
öğenize ekleyin. Ana makineniz Activity
veya Fragment
oluşturulduğunda öğe durumunu adaptör oluşturucuya iletin:
Kotlin
val adapter = MyAdapter(items, viewModel.retrieveState())
Java
MyAdapter adapter = new MyAdapter(items, viewModel.retrieveState());
4. Adaptörün ViewHolder
bölümünde liste öğesi durumunu kurtarma
RecyclerView.Adapter
'te 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()
:RecyclerView.Adapter
, yapılandırma değişikliğinden sonra durumunu nasıl geri yükleyeceğini belirtir.ViewModel
: Bir etkinliğin veya parçanın durumunu tutar.
Sonuçlar
RecyclerView
cihazınız artık kaydırma konumunu ve RecyclerView
listesindeki her öğenin durumunu geri yükleyebilir.
Bu kılavuzu içeren koleksiyonlar
Bu kılavuz, daha geniş Android geliştirme hedeflerini kapsayan, özel olarak seçilmiş Hızlı Kılavuz koleksiyonlarının bir parçasıdır:
![](https://developer.android.google.cn/static/images/quick-guides/collection-illustration.png?hl=tr)