EDIT: Untuk mengembalikan posisi semu yang persis sama , seperti di, membuatnya terlihat persis seperti itu, kita perlu melakukan sesuatu yang sedikit berbeda (Lihat di bawah cara mengembalikan nilai scrollY yang tepat):
Simpan posisi dan offset seperti ini:
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);
Dan kemudian pulihkan gulungan seperti ini:
LinearLayoutManager manager = (LinearLayoutManager) mRecycler.getLayoutManager();
manager.scrollToPositionWithOffset(mStatePos, (int) mStateOffset);
Ini mengembalikan daftar ke posisi semu yang sebenarnya . Terlihat jelas karena akan terlihat sama bagi pengguna, tetapi tidak akan memiliki nilai scrollY yang sama (karena kemungkinan perbedaan dalam dimensi tata letak lanskap / potret).
Perhatikan bahwa ini hanya berfungsi dengan LinearLayoutManager.
--- Di bawah ini cara mengembalikan scrollY yang tepat, yang kemungkinan akan membuat daftar terlihat berbeda ---
Terapkan OnScrollListener seperti ini:
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;
}
};
Ini akan menyimpan posisi gulir yang tepat setiap saat di mScrollY.
Simpan variabel ini di Bundle Anda, dan pulihkan dalam pemulihan status ke variabel lain , kami akan menyebutnya mStateScrollY.
Setelah pemulihan status dan setelah RecyclerView Anda menyetel ulang semua datanya, setel ulang gulir dengan ini:
mRecyclerView.scrollBy(0, mStateScrollY);
Itu dia.
Berhati-hatilah, Anda mengembalikan scroll ke variabel lain, ini penting, karena OnScrollListener akan dipanggil dengan .scrollBy () dan selanjutnya akan menyetel mScrollY ke nilai yang disimpan di mStateScrollY. Jika Anda tidak melakukan ini, mScrollY akan menggandakan nilai scroll (karena OnScrollListener bekerja dengan delta, bukan scroll absolut).
Penghematan negara dalam kegiatan dapat dicapai seperti ini:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(ARGS_SCROLL_Y, mScrollY);
}
Dan untuk memulihkan panggilan ini di onCreate () Anda:
if(savedState != null){
mStateScrollY = savedState.getInt(ARGS_SCROLL_Y, 0);
}
Penyimpanan status dalam fragmen bekerja dengan cara yang sama, tetapi penyimpanan status yang sebenarnya membutuhkan sedikit kerja ekstra, tetapi ada banyak artikel yang membahasnya, jadi Anda seharusnya tidak memiliki masalah untuk mencari tahu caranya, prinsip-prinsip menyimpan gulungan dan memulihkannya tetap sama.