Hoàn tác vị trí cuộn của RecyclerView.

Bạn có thể đã gặp sự cố khi RecyclerView mất vị trí cuộn khi Activity/Fragment của bạn được tạo lại. Điều này thường xảy ra do dữ liệu Adapter được tải không đồng bộ và dữ liệu đã được tải theo thời gian RecyclerView cần bố trí để không thể khôi phục vị trí cuộn. Bắt đầu với 1.2.0-alpha02, RecyclerView cung cấp API mới để cho phép khôi phục bố cục khối Adapter cho đến khi sẵn sàng. Đọc tiếp để tìm hiểu cách sử dụng API mới này và cách thức hoạt động của nó.

Khôi phục vị trí cuộn Có một số cách để đảm bảo vị trí cuộn chính xác mà bạn có thể đã áp dụng. Cách tốt nhất là đảm bảo rằng bạn luôn đặt dữ liệu trên Adapter trước khi bố trí đầu tiên vượt qua bằng cách lưu trữ dữ liệu bạn muốn hiển thị trong bộ nhớ, trong ViewModel hoặc trong kho lưu trữ. Nếu cách tiếp cận này không thể thực hiện được, các giải pháp khác sẽ phức tạp hơn, như tránh thiết lập Adapter trên RecyclerView, có thể gây ra sự cố với các mục như tiêu đề hoặc lạm dụng API LayoutManager.onRestoreInstanceState. Giải pháp recyclerview: 1.2.0-alpha02 là một phương thức Adaptor mới cho phép bạn thiết lập chính sách khôi phục trạng thái (thông qua enum StateRestorationPolicy). Điều này có 3 tùy chọn:

  1. ALLOW - trạng thái mặc định, khôi phục trạng thái RecyclerView ngay lập tức, trong lần bố trí tiếp theo
  2. PREVENT_WHEN_EMPTY - chỉ khôi phục trạng thái RecyclerView khi Adapter không trống (adapter.getItemCount ()> 0). Nếu dữ liệu của bạn được tải không đồng bộ, RecyclerView sẽ đợi cho đến khi dữ liệu được tải và chỉ sau đó trạng thái được khôi phục. Nếu bạn có các mục mặc định, như các tiêu đề hoặc tải các chỉ số tiến trình như một phần của Adapter, vì thế bạn nên sử dụng tùy chọn PREVENT, trừ khi các mục mặc định được thêm bằng MergeAdapter. MergeAdapter chờ đợi tất cả các Adapter của nó sẵn sàng và chỉ sau đó nó mới khôi phục trạng thái.
  3. PREVENT - tất cả khôi phục trạng thái được hoãn lại cho đến khi bạn đặt ALLOW hoặc PREVENT_WHEN_EMPTY.

Đặt chính sách khôi phục trạng thái trên adapter như thế này: adapter.stateRestorationPolicy = PREVENT_WHEN_EMPTY


All Rights Reserved