Mengelola status RecyclerView

RecyclerView dapat menampilkan data dalam jumlah besar menggunakan resource grafis yang minimal. Saat pengguna men-scroll item di RecyclerView, instance View item yang telah di-scroll keluar layar akan digunakan kembali untuk membuat item baru saat di-scroll di layar. Namun, perubahan konfigurasi, seperti rotasi perangkat, dapat mereset status RecyclerView, yang memaksa pengguna kembali men-scroll ke posisi sebelumnya dalam daftar item.

RecyclerView harus mempertahankan statusnya—terutama, posisi scroll—dan status elemen daftarnya selama semua perubahan konfigurasi.

Mempertahankan status

Tetapkan kebijakan pemulihan status RecyclerView.Adapter untuk menyimpan posisi scroll RecyclerView. Menyimpan status RecyclerView item daftar. Tambahkan status item daftar ke adaptor RecyclerView, dan pulihkan status item daftar saat terikat ke ViewHolder.

1. Mengaktifkan kebijakan pemulihan status Adapter

Aktifkan kebijakan pemulihan status adaptor RecyclerView sehingga posisi scroll RecyclerView tetap dipertahankan saat terjadi perubahan konfigurasi. Tambahkan spesifikasi kebijakan ke konstruktor adaptor:

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. Menyimpan status item daftar stateful

Simpan status item daftar RecyclerView kompleks, seperti item yang berisi elemen EditText. Misalnya, untuk menyimpan status EditText, tambahkan callback yang mirip dengan pengendali onClick untuk menangkap perubahan teks. Dalam callback, tentukan data yang akan disimpan:

Kotlin

input.addTextChangedListener(
    afterTextChanged = { text ->
        text?.let {
            // Save state here.
        }
    }
)

Java

input.addTextChangedListener(new TextWatcher() {

    ...

    @Override
    public void afterTextChanged(Editable s) {
        // Save state here.
    }
});

Deklarasikan callback di Activity atau Fragment Anda. Gunakan ViewModel untuk menyimpan status.

3. Menambahkan status item daftar ke Adapter

Tambahkan status item daftar ke RecyclerView.Adapter Anda. Teruskan status item ke konstruktor adaptor saat Activity atau Fragment host Anda dibuat:

Kotlin

val adapter = MyAdapter(items, viewModel.retrieveState())

Java

MyAdapter adapter = new MyAdapter(items, viewModel.retrieveState());

4. Memulihkan status item daftar dalam ViewHolder adaptor

Di RecyclerView.Adapter, saat Anda mengikat ViewHolder ke item, pulihkan status item:

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));
}

Poin utama

Hasil

RecyclerView Anda sekarang dapat memulihkan posisi scroll dan status setiap item dalam daftar RecyclerView.

Koleksi yang berisi panduan ini

Panduan ini adalah bagian dari koleksi Panduan Cepat pilihan yang membahas tujuan pengembangan Android yang lebih luas:

Aktifkan aplikasi Anda untuk mendukung pengalaman pengguna yang dioptimalkan di tablet, perangkat foldable, dan perangkat ChromeOS.

Ada pertanyaan atau masukan

Buka halaman pertanyaan umum (FAQ) dan pelajari panduan singkat atau hubungi kami dan beri tahu kami pendapat Anda.