Android ListView y位置

时间:2011-05-04 04:09:07

标签: android listview position state

似乎ListView没有以与ScrollView相同的方式公开其y位置。换句话说:我需要记住ListView滚动到的确切位置,并在我返回活动时设置它。

只是为了澄清:我不需要所选的项目......这很简单。我需要在ListView上恢复精确的像素y位置。

谢谢!

3 个答案:

答案 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);

我知道唯一正确的方法是保持列表的确切位置。上面标记为正确的解决方案会上下几个像素,因此不是最专业的解决方案。