假设我们有两个片段 -ListFragment
和SomeOtherFragment
。我们替换ListFragment
为SomeOtherFragment
(保存在后台堆栈中),然后返回。之后我们看到,ListFragment
滚动的那个位置是一样的。
但我不明白,为什么。
我在 's 的源代码中没有看到任何保持ListFragment
滚动位置的代码。onDestroyView
被调用,内部ListView
被重新创建。它是如何工作的?请指点我一段代码。
假设我们有两个片段 -ListFragment
和SomeOtherFragment
。我们替换ListFragment
为SomeOtherFragment
(保存在后台堆栈中),然后返回。之后我们看到,ListFragment
滚动的那个位置是一样的。
但我不明白,为什么。
我在 's 的源代码中没有看到任何保持ListFragment
滚动位置的代码。onDestroyView
被调用,内部ListView
被重新创建。它是如何工作的?请指点我一段代码。
您不会在 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;
}