【问题标题】:How does ListFragment restore scroll position after destroyView?ListFragment如何在destroyView后恢复滚动位置?
【发布时间】:2013-08-23 12:18:27
【问题描述】:

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

但我不明白,为什么。

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

【问题讨论】:

  • 尝试查看onSavedInstance(),它管理并提供您在onCreateView(Bundle savedInstanceState) 通话中获得的Bundle savedInstanceState
  • 这里是 ListFragment 的来源:grepcode.com/file/repository.grepcode.com/java/ext/…。我没有看到对 savedInstanceState 的任何特殊处理

标签: android android-listview android-listfragment


【解决方案1】:

您不会在 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.java/

【讨论】:

  • 谢谢!但我还是无法理解。 Fragment 的内容视图被重新创建,onCreateViewensureList 已被调用,所以mList 是全新的对象。它是如何从以前的状态中获取的?
  • 视图本身被重新创建,这是真的。但是当再次创建视图时,所有存储的数据都会传递给这个新对象。
  • 但是怎么做呢? onCreateView 调用inflater.inflate 不要使用savedInstanceStateonViewCreated 调用基本方法,它是空的,ensureListensureList 也不要使用 savedInstanceState。新对象如何从以前获取 instanceState?或者它是一种 Android 魔法?
  • 自行查看句柄保存状态。查看 View.java 类中的 dispatchSaveInstanceState 和 dispatchSaveInstanceState 方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多