需求場景:
一個ListView頁面,滑動閱讀到某一位置,然后退出頁面,下次再進入頁面的時候,想要直接滑動到上次閱讀的位置。
方案1:
頁面退出的時候,ListView.getFirstVisiblePosition()來獲取當前可見的第一個Item的position並記錄,下次再進入頁面的時候通過ListView.setSelection(int position)把ListView直接滑動到記憶的position。
此方案記憶的ListView的位置不夠精准,因為position指定的是ListView的Item的index,setSelection(int pos)只能把index為pos的item作為第一個可見的item來顯示,所以item總是頂頭顯示的,不會顯示滑出屏幕一半的item,所以ListView的位置只能定位到某個item的開始位置,並不精准。
方案1的升級:
在方案1的基礎上,再記錄FirstVisiblePosition item的top/bottom等位置參數,然后恢復的時候ListView再scrollTo一下。
此方案仍然不行,ListView的scrollTo沒效果。
終極方案:
退出頁面的時候:
Parcelable listState = listView.onSaveInstanceState();
記住listState對象;
再次進入頁面的時候:
listView.onRestoreInstanceState(listState);
記憶的位置分毫不差。
要注意:listView的狀態記憶后,還要保證其數據在兩次進入頁面時的一致性;
另:ListView的header會影響其狀態對象,不過這個是小問題。