DÜZENLEME: İçinde olduğu gibi tam olarak aynı görünen konumu geri yüklemek için, tam olarak olduğu gibi görünmesini sağlamak için, biraz farklı bir şey yapmamız gerekir (tam scrollY değerini nasıl geri yükleyeceğinizi aşağıya bakın):
Konumu ve ofseti şu şekilde kaydedin:
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);
Ve sonra parşömeni şu şekilde geri yükleyin:
LinearLayoutManager manager = (LinearLayoutManager) mRecycler.getLayoutManager();
manager.scrollToPositionWithOffset(mStatePos, (int) mStateOffset);
Bu, listeyi tam görünen konumuna geri yükler . Görünüşe göre kullanıcıya aynı görünecek, ancak aynı kaydırma değerine sahip olmayacak (yatay / dikey düzen boyutlarındaki olası farklılıklar nedeniyle).
Bunun yalnızca LinearLayoutManager ile çalıştığını unutmayın.
--- ScrollY'nin tam olarak nasıl geri yükleneceğinin altında, bu muhtemelen listeyi farklı gösterecektir ---
Şöyle bir OnScrollListener uygulayın:
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;
}
};
Bu, tam kaydırma konumunu her zaman mScrollY'de saklayacaktır.
Bu değişkeni Bundle'ınızda saklayın ve onu durum geri yüklemesinde farklı bir değişkene geri yükleyin , biz ona mStateScrollY adını vereceğiz.
Durum geri yüklemesinden sonra ve RecyclerView'unuz tüm verilerini sıfırladıktan sonra kaydırmayı şununla sıfırlayın:
mRecyclerView.scrollBy(0, mStateScrollY);
Bu kadar.
Kaydırmayı farklı bir değişkene geri yüklediğinizden emin olun, bu önemlidir, çünkü OnScrollListener .scrollBy () ile çağrılacak ve daha sonra mScrollY'yi mStateScrollY'de depolanan değere ayarlayacaktır. Bunu yapmazsanız, mScrollY iki kat kaydırma değerine sahip olacaktır (çünkü OnScrollListener, mutlak kaydırmalarla değil deltalarla çalışır).
Faaliyetlerde durum tasarrufu şu şekilde sağlanabilir:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(ARGS_SCROLL_Y, mScrollY);
}
Ve geri yüklemek için bunu onCreate () içinde arayın:
if(savedState != null){
mStateScrollY = savedState.getInt(ARGS_SCROLL_Y, 0);
}
Parçalarda durum tasarrufu benzer şekilde çalışır, ancak gerçek durum tasarrufu biraz fazladan çalışma gerektirir, ancak bununla ilgili birçok makale vardır, bu nedenle parşömeni kaydetme ilkelerini bulmakta sorun yaşamazsınız. ve onu geri yüklemek aynı kalır.