2013-08-23 85 views
1

假設我們有兩個片段 - ListFragmentSomeOtherFragment。我們將ListFragment替換爲SomeOtherFragment(保存在堆棧中),然後返回。之後我們看到,ListFragment滾動的那個位置是一樣的。ListView如何在destroyView後恢復滾動位置?

但我不明白,爲什麼。

我在ListFragment的源代碼中看不到任何代碼,它保持滾動位置。 onDestroyView被調用,內部ListView被重新創建。它是如何工作的?請指點我的一段代碼。

+0

試圖尋找到'負責管理並提供onSavedInstance()'的' Bundle savedInstanceState'你得到你的'onCreateView(Bundle savedInstanceState)'調用。 – Shark

+0

這裏是ListFragment的來源:http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.0.3_r1/android/app/ListFragment.java?av=f。我沒有看到任何特殊處理savedInstanceState – darja

回答

0

您不會在ListFragment或ListActivity中找到保存狀態,導致所有存儲位置的過程都在ListView中完成。 ListFragment只是簡單地使用ListView。當你打開AbsListView.java時,你可以看看兩種方法。

@Override Parcelable onSaveInstanceState() { 
    [...] 
     if (selectedId >= 0) { 
      // Remember the selection 
      ss.viewTop = mSelectedTop; 
      ss.position = getSelectedItemPosition(); 
      ss.firstId = INVALID_POSITION; 
} 

以及這些值將恢復地方

@Override 
public void onRestoreInstanceState(Parcelable state) { 
     [...] 
     if (ss.selectedId >= 0) { 
      mNeedSync = true; 
      mPendingSync = ss; 
      mSyncRowId = ss.selectedId; 
      mSyncPosition = ss.position; 
      mSpecificTop = ss.viewTop; 
      mSyncMode = SYNC_SELECTED_POSITION; 
} 

您可以通過yoursefl看看源代碼在這裏http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.3_r2.1/android/widget/AbsListView.java/

+0

謝謝!但我仍然無法理解。片段的內容視圖被重新創建,'onCreateView'和'ensureList'已被調用,所以'mList'是完全新對象。它是如何從以前的狀態? – darja

+0

視圖本身被重新創建,這是真的。但是,當再次創建視圖時,所有存儲的數據都會傳遞給這個新對象。 – Mike

+0

但是如何? 'onCreateView'調用'inflater.inflate'不使用'savedInstanceState'; 'onViewCreated'調用空的基方法和'ensureList'。 'sureList'也不使用'savedInstanceState'。新對象如何從之前獲得instanceState?或者它是一種Android魔法? – darja

相關問題