1. 程式人生 > >android ListView 記錄當前位置 恢復

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 位置嘛