似乎ListView没有以与ScrollView相同的方式公开其y位置。换句话说:我需要记住ListView滚动到的确切位置,并在我返回活动时设置它。
只是为了澄清:我不需要所选的项目......这很简单。我需要在ListView上恢复精确的像素y位置。
谢谢!
答案 0 :(得分:17)
我在切换方向时保存(在onSaveInstanceState中)和恢复(onCreate)时成功使用了这个:
保存:
int savedPosition = list.getFirstVisiblePosition();
View firstVisibleView = list.getChildAt(0);
int savedListTop = (firstVisibleView == null) ? 0 : firstVisibleView.getTop();
恢复:
if (savedPosition >= 0) { //initialized to -1
list.setSelectionFromTop(savedPosition, savedListTop);
}
这将精确保存Y位置。好吧,它偶尔会错过几个像素。
答案 1 :(得分:3)
当您从另一个Activity返回时,ListView将保持滚动到其离开ListView Activity时的原始位置。如果要更新列表的内容,请确保在适配器上使用notifyDataSetChanged(),不要重新分配适配器 - 这会将列表重置为顶部。
检查ListView活动中的onResume方法,它可能正在重新分配列表适配器。
如果你需要记住一个不依赖于活动堆栈的任意滚动位置,我愿意打赌除了保存当前选定的或第一个可见项目之外是不可能的。 ListView没有定义的高度。它与项目数量和这些项目的内容有关。
答案 2 :(得分:2)
Parcelable state = list.onSaveInstanceState();
// do stuff
list.onRestoreInstanceState(state);
我知道唯一正确的方法是保持列表的确切位置。上面标记为正确的解决方案会上下几个像素,因此不是最专业的解决方案。