Quản lý trạng thái RecyclerView

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

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:

Cho phép ứng dụng của bạn hỗ trợ trải nghiệm người dùng được tối ưu hoá trên máy tính bảng, thiết bị có thể gập lại và thiết bị ChromeOS.

Bạn có câu hỏi hoặc ý kiến phản hồi

Truy cập vào trang câu hỏi thường gặp của chúng tôi để tìm hiểu về các hướng dẫn nhanh hoặc liên hệ với chúng tôi để chia sẻ ý kiến của bạn.