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 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

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:

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

Hãy truy cập vào trang câu hỏi thường gặp để tìm hiểu về các hướng dẫn nhanh hoặc liên hệ với chúng tôi để cho chúng tôi biết suy nghĩ của bạn.