假设我有PreferenceActivity
(出于兼容性原因,我无法将其转换为使用片段)。 PreferenceActivity
中的一个设置是当前应用程序主题,我希望在更改首选项时立即应用,方法是调用PreferenceActivity#recreate()
强制重新创建活动(使用新主题)。
不幸的是,该活动包含许多设置,可能需要滚动。在重新创建活动时,我想恢复上一个滚动位置,以便从一个主题到另一个主题的无缝过渡。
请注意使用ListView
中的getListView().getScrollY()
保留嵌入的onSaveInstanceState
滚动位置,但始终返回零。
有没有办法获取PreferenceActivity
的列表滚动位置并稍后恢复?
答案 0 :(得分:2)
首先,您需要获得2个值:
final int firstVisibleItem = getListView().getFirstVisiblePosition();
final int firstVisibleItemTop = getListView().getChildAt(0).getTop();
然后将它们保存到一些存储空间(Preferences或Intent的萌芽或其他地方)。要从这些值恢复滚动位置:
final ListView listView = getListView();
listView.setSelection(firstVisibleItem);
listView.smoothScrollBy(-firstVisibleItemTop, 0);