【问题标题】:Android ListView y positionAndroid ListView y位置
【发布时间】:2011-05-04 04:09:07
【问题描述】:

似乎 ListView 不像 ScrollView 那样暴露它的 y 位置。换句话说:我需要记住 ListView 滚动到的确切位置,并在我返回活动时设置它。

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

谢谢!

【问题讨论】:

标签: android listview position state


【解决方案1】:

我在保存(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 位置。嗯,它每隔一段时间就会丢失几个像素。

【讨论】:

  • 嗯...看起来很有希望,我一定会尝试 - 我会告诉你的。
  • 非常感谢您的回答对我帮助很大:)
【解决方案2】:

当您从另一个 Activity 返回时,ListView 将保持滚动到您离开该 ListView Activity 时的原始位置。如果您要更新列表的内容,请确保您只在适配器上使用 notifyDataSetChanged(),不要重新分配适配器 - 这会将列表重置为顶部。

检查您的 ListView Activity 中的 onResume 方法,它可能正在重新分配列表适配器。

如果您需要记住不依赖于 Activity 堆栈的任意滚动位置,我敢打赌,除了保存当前选定或第一个可见项目之外,这是不可能的。 ListView 没有定义的高度。它与项目的数量和这些项目的内容有关。

【讨论】:

  • 所以是 ListView#setAdapter 搞砸了,对吧?是的,我可能不得不使用的是,因为我的 ListView 被其他显示相同数据的 ListView 取代。我不想将其包含在问题的主体中以使其保持简单,但我在画廊中使用我的 ListViews,因此它们基本上不会被回收。我可以为新的 ListView 提供与旧的相同的适配器,但我必须使用 setAdapter...
  • 谢谢丹,你拯救了我的一天!
【解决方案3】:
Parcelable state = list.onSaveInstanceState();

// do stuff

list.onRestoreInstanceState(state);

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

【讨论】:

    猜你喜欢
    • 2018-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多