如何使列表视图可滚动,直到最后一个元素位于屏幕顶部

4
我正在开发一个应用程序,需要显示日历议程,就像原生日历中的议程一样。我有一个列表视图,显示不同的事件(注:在问题的上下文中,“事件”是我的系统实体)。我希望在这个屏幕上提供一个“今天”按钮。当用户点击此按钮时,应该滚动事件,直到当前日期的第一个事件出现在屏幕顶部。问题出现在我只安排了几个事件,以至于他们无法填满整个屏幕。然后,列表视图会滚动到日历中的最后一个事件处于底部。这通常意味着无法实现希望将今天的第一个事件置于顶部的效果。
有什么建议可以解决这个问题吗?我考虑添加一些空元素,但这似乎是一个丑陋的变通方法,而且还需要特殊的设备特定计算来告诉我要插入多少个元素。
编辑: 添加一些代码,如评论中所请求的。 实际上,我不确定这段代码是否会让任何人感到惊讶,但:
public void onTodayClicked(View target) {
  // calculate the indexOf. It works and is not related to the question
  if (indexOf >= 0) {
     ListView list = (ListView) findViewById(R.id.events_list_view);
     list.setSelection(indexOf);
  }
}

我不确定布局定义是否对于回答问题有帮助,但如果您认为有用的话,我也可以添加。

你现在如何进行滚动操作?你能发布一些代码吗? - balazsbalazs
1个回答

0

您可以通过两种方式实现:

  1. 调用smoothScrollToPositionFromTop方法
  2. 调用setSelectionFromTop方法

使用smoothScroll方法更好,因为它可以平滑地过渡 - 这意味着它确实会滚动到该位置。 唯一的缺点是它仅在API级别11之后可用。

setSelectionFromTop方法自API级别1起就可用,但它不会平滑滚动,而是跳转到行。

如果您不需要将位置定位到屏幕顶部,只需查看行,则还可以使用smoothScrollToPosition,这是一个API级别8的调用。


如果你将这些方法的位置设为列表中的第一个,它们就能正常工作。 (根据你的描述,我认为你可能计算的是最后一个位置,但我无法确定)。

谢谢你的回答。然而,我手头没有支持比姜饼更高的设备(Api级别9-10)。也许我以后会在模拟器中测试您的建议,以便为未来的读者验证您的建议,但这肯定不会解决我的问题。 由于您自愿尝试为旧版本找出解决方案,而我自己已经没有想法了,如果您能进一步协助我解决问题,我将非常感激。 - Boris Strandjev
我刚刚有机会测试了你提出的建议。遗憾的是,似乎你误解了我的要求。你所提出的方法确实可以滚动,但是就像我已经拥有的一样。我的问题是:假设列表中有很多项,比如1000项。如果我说要滚动到第40项,一切都很好,它会显示在屏幕顶部。然而,如果我说“滚动到第999项”,它只会滚动到这个项目可见,并不会将其放置在顶部。原因可能是线性布局之后没有空白空间?我需要每个项目都放在顶部。 - Boris Strandjev
哦,好的,我误解了。 然而,使用ListView不能实现你想要做的事情。 你可以计算所需的高度(使用getFirstVisiblePosition()、getChildAtIndex()、getTop()方法),然后在列表末尾插入一行。但这并不容易,你需要注意几件事情。 - balazsbalazs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接