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.
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 liste öğelerinin durumunu geri yükleyin.
1. Adapter
durumunu geri yükleme politikasını etkinleştirin.
RecyclerView
bağdaştırıcısının durum geri yükleme politikasını etkinleştirin. Böylece, yapılandırma değişiklikleri sırasında RecyclerView
öğesinin kaydırma konumu 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. Durumlu 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 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 derlenmiş Hızlı Kılavuz koleksiyonlarının bir parçasıdır:
