संपादित करें: ठीक उसी स्पष्ट स्थिति को पुनर्स्थापित करने के लिए , जैसा कि यह ठीक वैसा ही बना है, हमें कुछ अलग करने की आवश्यकता है (सटीक स्क्रॉल मूल्य को पुनर्स्थापित करने के लिए नीचे देखें)
इस तरह स्थिति और ऑफसेट सहेजें:
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);
और फिर इस तरह स्क्रॉल पुनर्स्थापित करें:
LinearLayoutManager manager = (LinearLayoutManager) mRecycler.getLayoutManager();
manager.scrollToPositionWithOffset(mStatePos, (int) mStateOffset);
यह सूची को उसकी सटीक स्पष्ट स्थिति में पुनर्स्थापित करता है । स्पष्ट है क्योंकि यह उपयोगकर्ता के लिए समान दिखेगा, लेकिन इसका एक ही स्क्रॉल मूल्य (परिदृश्य / पोर्ट्रेट लेआउट आयामों में संभावित अंतर के कारण) नहीं होगा।
ध्यान दें कि यह केवल LinearLayoutManager के साथ काम करता है।
--- सटीक स्क्रॉल को पुनर्स्थापित करने के लिए नीचे, जो संभवतः सूची को अलग दिखने देगा ---
एक OnScrollListener की तरह लागू करें:
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;
}
};
यह mScrollY में हर समय सटीक स्क्रॉल स्थिति संग्रहीत करेगा।
इस वैरिएबल को अपने बंडल में स्टोर करें, और इसे स्टेट रिस्टोरेशन में एक अलग वेरिएबल में रिस्टोर करें, हम इसे mStateScrollY कहेंगे।
राज्य बहाली के बाद और आपके RecyclerView ने अपने सभी डेटा को रीसेट कर दिया है और इसके साथ स्क्रॉल रीसेट करें:
mRecyclerView.scrollBy(0, mStateScrollY);
बस।
खबरदार, कि आप स्क्रॉल को एक अलग चर में पुनर्स्थापित करते हैं, यह महत्वपूर्ण है, क्योंकि OnScrollListener को .scrollBy () के साथ बुलाया जाएगा और बाद में mStateSrollY में संग्रहीत मूल्य पर mScrollY सेट करेगा। यदि आप ऐसा नहीं करते हैं तो mScrollY का स्क्रॉल मान दोगुना होगा (क्योंकि OnScrollListener डेल्टास के साथ काम करता है, निरपेक्ष स्क्रॉल नहीं)।
गतिविधियों में राज्य की बचत इस तरह से प्राप्त की जा सकती है:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(ARGS_SCROLL_Y, mScrollY);
}
और अपने onCreate में इसे पुनर्स्थापित करने के लिए ():
if(savedState != null){
mStateScrollY = savedState.getInt(ARGS_SCROLL_Y, 0);
}
टुकड़ों में राज्य की बचत एक समान तरीके से काम करती है, लेकिन वास्तविक राज्य की बचत के लिए थोड़े अतिरिक्त काम की आवश्यकता होती है, लेकिन इससे निपटने के लिए बहुत सारे लेख हैं, इसलिए आपको यह पता लगाने में कोई समस्या नहीं होनी चाहिए कि, स्क्रॉल को बचाने के सिद्धांत और इसे बहाल करना वही रहता है।