CHỈNH SỬA: Để khôi phục lại vị trí biểu kiến chính xác , như trong, làm cho nó trông giống hệt như lúc trước, chúng ta cần làm điều gì đó khác một chút (Xem bên dưới cách khôi phục giá trị scrollY chính xác):
Lưu vị trí và bù đắp như thế này:
LinearLayoutManager manager = (LinearLayoutManager) mRecycler.getLayoutManager();
int firstItem = manager.findFirstVisibleItemPosition();
View firstItemView = manager.findViewByPosition(firstItem);
float topOffset = firstItemView.getTop();
outState.putInt(ARGS_SCROLL_POS, firstItem);
outState.putFloat(ARGS_SCROLL_OFFSET, topOffset);
Và sau đó khôi phục cuộn như thế này:
LinearLayoutManager manager = (LinearLayoutManager) mRecycler.getLayoutManager();
manager.scrollToPositionWithOffset(mStatePos, (int) mStateOffset);
Điều này khôi phục danh sách về vị trí rõ ràng chính xác của nó . Rõ ràng vì nó sẽ trông giống nhau đối với người dùng, nhưng nó sẽ không có cùng giá trị scrollY (vì có thể có sự khác biệt về kích thước bố cục ngang / dọc).
Lưu ý rằng điều này chỉ hoạt động với LinearLayoutManager.
--- Dưới đây làm thế nào để khôi phục lại chính xác scrollY, có thể sẽ làm cho danh sách trông khác ---
Áp dụng một OnScrollListener như vậy:
private int mScrollY;
private RecyclerView.OnScrollListener mTotalScrollListener = new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
mScrollY += dy;
}
};
Điều này sẽ lưu trữ vị trí cuộn chính xác mọi lúc trong mScrollY.
Lưu trữ biến này trong Gói của bạn và khôi phục nó ở trạng thái khôi phục thành một biến khác , chúng tôi sẽ gọi nó là mStateScrollY.
Sau khi khôi phục trạng thái và sau khi RecyclerView của bạn đã đặt lại tất cả dữ liệu của nó, hãy đặt lại cuộn với điều này:
mRecyclerView.scrollBy(0, mStateScrollY);
Đó là nó.
Lưu ý rằng bạn khôi phục cuộn sang một biến khác, điều này rất quan trọng, vì OnScrollListener sẽ được gọi với .scrollBy () và sau đó sẽ đặt mScrollY thành giá trị được lưu trữ trong mStateScrollY. Nếu bạn không làm điều này, mScrollY sẽ có giá trị cuộn gấp đôi (vì OnScrollListener hoạt động với delta, không phải cuộn tuyệt đối).
Tiết kiệm nhà nước trong các hoạt động có thể đạt được như sau:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(ARGS_SCROLL_Y, mScrollY);
}
Và để khôi phục, hãy gọi điều này trong onCreate () của bạn:
if(savedState != null){
mStateScrollY = savedState.getInt(ARGS_SCROLL_Y, 0);
}
Lưu trạng thái trong các đoạn hoạt động theo cách tương tự, nhưng việc lưu trạng thái thực tế cần thêm một chút công việc, nhưng có rất nhiều bài viết giải quyết vấn đề đó, vì vậy bạn sẽ không gặp khó khăn khi tìm hiểu cách thức, nguyên tắc lưu cuộn Y và khôi phục nó vẫn như cũ.