android ListView 記錄當前位置 恢復
為了更好的使用者體驗,當我們使用 ListView 展示列表內容,使用者點選進入下級列表後,返回上級時,我們應當給使用者返回到上次所在位置
首先你可能會想到使用: void scrollTo(int x, int y) 方法儲存 ListView y 位置,
但是實際上,ListView 並不是一個 scroll,你不信可以監聽他的滾動事件,x y 引數始終是 0
所以此法不可行
為什麼呢?
ListView 原理是建立佔據螢幕高度的 View 條數 + 1,當我向上滑動的時候,所有 View y 上移,直到 第一條 View 完全看不到,然後這條 View 就會被移到最後,
此時他不可見,因為到螢幕外去了,當你繼續滑動的時候,現在的第一條(相當於原始的第二條)逐漸滾出螢幕,原先的第一條(現在是最後一條),就從螢幕底部出現,
填補空白,這就是我們在 Adapter 裡要使用 View Holder 的原因,所有的 View 是迴圈利用的
以此類推,所以不管你有多少內容,ListView 始終只有佔據螢幕高度的 View 條數,
不能理解的自己仔細琢磨琢磨
下面我來講實現》
你可能注意到,ListView 有一個方法:
void setSelection(int position)
void setSelectionFromTop(int position, int y)
意思是是 position 位置的內容顯示在 ListView 第一條,就是使 ListView 滾動到 position 的意思,實際上你呼叫這個方法的時候他並沒有滾動過程,而是直接到
而:setSelection(int position) 相當於 setSelectionFromTop(position, 0)
所以我們在進入下級內容之前,儲存當前第一條 View 的 position 即可,如何獲取這個 position 呢
使用:int getFirstVisiblePosition() 這個方法
然後返回上級的時候,再取出 position ,使用 setSelection 方法即可恢復位置,如圖所示:
假如你沒發現這2張圖有什麼區別,下面的內容也不用看了,
當然如果你細心一點你會發現,.estrings 目錄的位置有點偏差,對的,因為 setSelection() 預設設定第一條 view 在頂端位置,
當然做到這一步其實使用者很難察覺有什麼不一樣,
但是如果追求完美,你就像恢復到原模原樣,怎麼辦,還有一個 setSelectionFromTop 方法嘛
那這個 y 怎麼獲取呢,
ListView.getChildAt(0).getTop()
意思就是第一條 View 的 y 位置嘛