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 RecyclerView
, các thực thể View
của mục đã cuộn ra khỏi màn hình sẽ được sử dụng lại để tạo các mục mới khi tiếp tục cuộn trên màn hình. Tuy nhiên, thay đổi 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.
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 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 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 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.Adapter
khô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.
Kết quả
Giờ đây, RecyclerView
đã có thể khôi phục lại vị trí cuộn và trạng thái của mọi mục trong danh sách RecyclerView
.
Các bộ sưu tập chứa hướng dẫn này
Hướng dẫn này là một phần của các bộ sưu tập Hướng dẫn nhanh được tuyển chọn này, bao gồm các mục tiêu phát triển Android rộng hơn:
![](https://developer.android.com/static/images/quick-guides/collection-illustration.png?hl=vi)