2015-04-04 44 views
-1

我有一個listfragment和instagram式的照片源。如何保留listview的位置,以便下次應用程序啓動時顯示listview究竟在哪裏,以及它剩下的是什麼?如何將listview定位到應用程序銷燬之前剩下的位置?

編輯:我打算寫入列表視圖的sharedPreferences位置在onPause,然後讓他們onCreate並通過setSelectionFromTop(int position,int y)設置listview的位置。但是我不知道如何獲得y。如果我將y = 0,那麼在該位置的視圖將首先被看到,即在屏幕的頂部。但事實並非如此。該視圖可能留在上次屏幕中間

回答

0

請記住,在Android中,您完全不知道關閉應用程序的時間,因爲沒有可以爲此目的監聽的事件。因此,您應該定期(或在您的滾動監聽器中)在共享首選項(理想情況下在後臺線程上允許平滑滾動)或內部數據庫中將可見項目的位置寫入列表視圖中,並那麼當應用程序啓動時,檢查值並正確定位你的列表視圖。

我不認爲有任何其他的方式來實現你在找什麼。

+0

我打算寫入列表視圖的sharedPreferences位置onPause,然後讓他們onCreate並通過setSelectionFromTop(int位置,int y)設置列表視圖的位置。但是我不知道如何獲得y。如果我將y = 0,那麼在該位置的視圖將首先被看到,即在屏幕的頂部。但事實並非如此。該視圖可能留在上次屏幕中間 – Nazerke 2015-04-04 12:39:02

+0

這不是我會做的。想象一下,你的列表視圖中有100個項目,而「上次瀏覽的項目」是具有「id = 12345」的第98個項目。我會保存的將是'12345'(我正在顯示的視圖的ID),然後當用戶調出屏幕時,搜索我的列表,使用該ID查找該項目的位置,然後設置listview到那。你應該使用'setSelection(position)'而不是'setSelectionFromTop()' – kha 2015-04-04 12:42:23

+0

是的,但是這會在屏幕的最開始顯示ID爲12345的項目,而該項目可能已經接近中間或底部或應用程序被銷燬前屏幕上的任何其他地方。 – Nazerke 2015-04-04 14:30:40

1

我認爲最準確的方法來獲取列表視圖的位置是從setOnScrollListener

ListView listview = getListView(); 

    listview.setOnScrollListener(new AbsListView.OnScrollListener() { 
    @Override 
    public void onScrollStateChanged(AbsListView view, int scrollState) { 
    } 

    @Override 
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
    ... 
    } 

注:

  • 保存firstVisibleItem值到在onScroll方法sharedPreferences。
  • getListView當ListFragment被子類化時,可以使用該方法。
  • 我使用了listview.setSelection方法在Listview中設置某一行的位置,這就足夠了。
  • 最後,setOnScrollListener是性能高效的。我沒有注意到任何性能滯後。
相關問題