RecyclerView dapat menampilkan data dalam jumlah besar menggunakan resource grafis yang minimal. Saat pengguna men-scroll item di RecyclerView, View
instance 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.
Kompatibilitas versi
Implementasi ini kompatibel dengan semua level API.
Dependensi
Tidak ada.
Mempertahankan status
Menyetel kebijakan pemulihan status RecyclerView.Adapter untuk menyimpan
RecyclerView posisi scroll. Menyimpan status item daftar RecyclerView. 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
Menyimpan status item daftar RecyclerView yang 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-poin utama
RecyclerView.Adapter#setStateRestorationPolicy(): Menentukan cara aRecyclerView.Adaptermemulihkan statusnya setelah perubahan konfigurasi.ViewModel: Mempertahankan status untuk aktivitas atau fragmen.
Koleksi yang berisi panduan ini
Panduan ini adalah bagian dari koleksi Panduan Singkat pilihan yang mencakup sasaran pengembangan Android yang lebih luas: