RecyclerView durumunu yönetme

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

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:

Uygulamanızın tabletler, katlanabilir cihazlar ve ChromeOS cihazlarda optimize edilmiş bir kullanıcı deneyimi sunmasını sağlayın.

Sorularınız veya geri bildiriminiz mi var?

Sık sorulan sorular sayfamıza giderek kısa kılavuzlar hakkında bilgi edinebilir veya bize ulaşarak düşüncelerinizi bizimle paylaşabilirsiniz.