แก้ไข:ในการคืนค่าตำแหน่งที่ชัดเจนเหมือนเดิมให้เหมือนเดิมทุกประการเราจำเป็นต้องทำอะไรบางอย่างที่แตกต่างออกไปเล็กน้อย (ดูวิธีคืนค่าค่า scrollY ที่แน่นอนด้านล่าง):
บันทึกตำแหน่งและชดเชยดังนี้:
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);
คืนนี้รายการเพื่อมันแน่นอนชัดเจนตำแหน่ง เห็นได้ชัดเนื่องจากผู้ใช้จะมีลักษณะเหมือนกัน แต่จะไม่มีค่า scrollY เท่ากัน (เนื่องจากความแตกต่างที่เป็นไปได้ในขนาดเค้าโครงแนวนอน / แนวตั้ง)
โปรดทราบว่าสิ่งนี้ใช้ได้กับ LinearLayoutManager เท่านั้น
- ด้านล่างวิธีการคืนค่าการเลื่อนที่แน่นอน Y ซึ่งอาจทำให้รายการดูแตกต่างออกไป ---
ใช้ 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
เก็บตัวแปรนี้ไว้ใน Bundle ของคุณและเรียกคืนในการกู้คืนสถานะเป็นตัวแปรอื่นเราจะเรียกมันว่า mStateScrollY
หลังจากการกู้คืนสถานะและหลังจาก RecyclerView ของคุณรีเซ็ตข้อมูลทั้งหมดรีเซ็ตการเลื่อนด้วยสิ่งนี้:
mRecyclerView.scrollBy(0, mStateScrollY);
แค่นั้นแหละ.
ระวังว่าคุณเรียกคืนการเลื่อนเป็นตัวแปรอื่นสิ่งนี้มีความสำคัญเนื่องจาก OnScrollListener จะถูกเรียกด้วย. scrollBy () จากนั้นจะตั้งค่า mScrollY เป็นค่าที่เก็บไว้ใน mStateScrollY หากคุณไม่ทำ 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);
}
การบันทึกสถานะเป็นเศษเล็กเศษน้อยทำงานในลักษณะเดียวกัน แต่การประหยัดสถานะจริงต้องการการทำงานเพิ่มเติมเล็กน้อย แต่มีบทความมากมายที่เกี่ยวข้องกับเรื่องนี้ดังนั้นคุณจึงไม่ควรมีปัญหาในการค้นหาว่าหลักการของการบันทึกการเลื่อน Y และการคืนค่ายังคงเหมือนเดิม