Hoàn tác vị trí cuộn của RecyclerView.
Bài đăng này đã không được cập nhật trong 3 năm
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:
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 theoPREVENT_WHEN_EMPTY
- chỉ khôi phục trạng tháiRecyclerView
khiAdapter
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ủaAdapter
, vì thế bạn nên sử dụng tùy chọnPREVENT
, trừ khi các mục mặc định được thêm bằngMergeAdapter
.MergeAdapter
chờ đợi tất cả cácAdapter
của nó sẵn sàng và chỉ sau đó nó mới khôi phục trạng thái.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