RecyclerView durumunu yönetme

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

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:

Uygulamanızın tabletlerde, katlanabilir cihazlarda ve ChromeOS cihazlarda optimize edilmiş bir kullanıcı deneyimini desteklemesini sağlayın.

Sorularınız veya geri bildiriminiz mi var?

Sık sorulan sorular sayfamıza giderek hızlı kılavuzlar hakkında bilgi edinebilir veya düşüncelerinizi bize iletebilirsiniz.