1

假设我们有两个片段 -ListFragmentSomeOtherFragment。我们替换ListFragmentSomeOtherFragment(保存在后台堆栈中),然后返回。之后我们看到,ListFragment滚动的那个位置是一样的。

但我不明白,为什么。

我在 's 的源代码中没有看到任何保持ListFragment滚动位置的代码。onDestroyView被调用,内部ListView被重新创建。它是如何工作的?请指点我一段代码。

4

1 回答 1

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;
}

您可以在http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.3_r2.1/android/widget/AbsListView 查看您自己的源代码。爪哇/

于 2013-08-23T12:40:00.417 回答