RecyclerView
dapat menampilkan data dalam jumlah besar menggunakan resource grafis yang minimal. Saat pengguna men-scroll item dalam 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.
Hasil
RecyclerView
Anda dapat memulihkan posisi scroll dan status setiap item dalam daftar RecyclerView
.
Mempertahankan status
Menyetel kebijakan pemulihan status RecyclerView.Adapter
untuk menyimpan posisi scroll RecyclerView
. Menyimpan status RecyclerView
item daftar. Menambahkan
status item daftar ke adaptor RecyclerView
, dan memulihkan 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
RecyclerView.Adapter#setStateRestorationPolicy()
: Menentukan caraRecyclerView.Adapter
memulihkan statusnya setelah perubahan konfigurasi.ViewModel
: Mempertahankan status untuk aktivitas atau fragmen.
Koleksi yang berisi panduan ini
Panduan ini adalah bagian dari koleksi Panduan Cepat pilihan yang mencakup tujuan pengembangan Android yang lebih luas:
