RecyclerView có thể hiển thị một lượng lớn dữ liệu bằng cách sử dụng ít tài nguyên đồ hoạ nhất có thể. Khi người dùng cuộn qua các mục trong một RecyclerView, các thực thể View của các mục đã cuộn ra khỏi màn hình sẽ được dùng lại để tạo các mục mới khi người dùng cuộn trên màn hình. Tuy nhiên, các thay đổi về cấu hình, chẳng hạn như việc xoay thiết bị, có thể đặt lại trạng thái của RecyclerView, buộc người dùng phải cuộn lại vị trí trước đó trong danh sách các mục.
RecyclerView phải giữ nguyên trạng thái (cụ thể là vị trí cuộn) và trạng thái của các phần tử trong danh sách tại tất cả thay đổi cấu hình.
Kết quả
RecyclerView có thể khôi phục vị trí cuộn và trạng thái của mọi mục trong danh sách RecyclerView.
Duy trì trạng thái
Thiết lập chính sách khôi phục trạng thái của RecyclerView.Adapter để lưu vị trí cuộn RecyclerView. Lưu trạng thái của mục trong danh sách RecyclerView. Thêm trạng thái của các mục trong danh sách vào bộ chuyển đổi RecyclerView rồi khôi phục trạng thái của các mục trong danh sách khi được liên kết với ViewHolder.
1. Bật chính sách khôi phục trạng thái Adapter
Bật chính sách khôi phục trạng thái trong bộ chuyển đổi RecyclerView để giữ nguyên vị trí cuộn của RecyclerView trên mọi thay đổi về cấu hình. Thêm thông số của chính sách vào hàm khởi tạo bộ chuyển đổi:
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. Lưu trạng thái của mục trong danh sách có trạng thái
Lưu trạng thái của mục trong danh sách RecyclerView phức tạp, chẳng hạn như các mục chứa phần tử EditText. Ví dụ: để lưu trạng thái của EditText, hãy thêm một lệnh gọi lại tương tự như trình xử lý onClick để ghi lại các thay đổi trong văn bản. Trong lệnh gọi lại, hãy xác định dữ liệu cần lưu:
Kotlin
input.addTextChangedListener( afterTextChanged = { text -> text?.let { // Save state here. } } )
Java
input.addTextChangedListener(new TextWatcher() { ... @Override public void afterTextChanged(Editable s) { // Save state here. } });
Khai báo lệnh gọi lại trong Activity hoặc Fragment. Sử dụng ViewModel để lưu trữ trạng thái.
3. Thêm trạng thái của mục trong danh sách vào Adapter
Thêm trạng thái của mục trong danh sách vào RecyclerView.Adapter. Truyền trạng thái của mục đến hàm khởi tạo bộ chuyển đổi khi tạo máy chủ lưu trữ Activity hoặc Fragment:
Kotlin
val adapter = MyAdapter(items, viewModel.retrieveState())
Java
MyAdapter adapter = new MyAdapter(items, viewModel.retrieveState());
4. Khôi phục trạng thái của mục trong danh sách trên ViewHolder của bộ chuyển đổi
Trong RecyclerView.Adapter, khi bạn liên kết ViewHolder với một mục, hãy khôi phục trạng thái của mục đó:
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)); }
Điểm chính
RecyclerView.Adapter#setStateRestorationPolicy(): Chỉ định cáchRecyclerView.Adapterkhôi phục trạng thái sau khi thay đổi cấu hình.ViewModel: Lưu giữ trạng thái của một hoạt động hoặc mảnh.
Bộ sưu tập có chứa hướng dẫn này
Hướng dẫn này là một phần của bộ sưu tập Hướng dẫn nhanh được tuyển chọn, bao gồm các mục tiêu phát triển Android rộng hơn: