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.

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

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:

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.