【问题标题】:ListView distance from top of the listListView 到列表顶部的距离
【发布时间】:2012-10-29 02:54:36
【问题描述】:

我有一个 ListView,我想制作一个随列表滚动的背景。

我看到了Shelves 的代码,因为GridView 中的所有项目的高度都相同,这是我做不到的保证。我认为我可以使用类似的技术(即覆盖 dispatchDraw),但我需要知道每个项目与 ListView 顶部的距离 - 我如何预先计算? ListView 大多是静态的,而且相当小,所以如果我在向列表中添加新项目时必须重新计算也没关系。

所以我的问题是:给定一个 ListView 和一个 List 适配器,我如何计算每个项目与列表顶部的距离?也就是说,项目 0 距离顶部 0 像素,项目 20 可能距离顶部 4032 像素。或者,有没有更好的方法来做我想做的事?

【问题讨论】:

  • 我没试过这个,所以我不会把它作为答案,但我相信你可以使用getItemAtPosition来检索View。可以使用View的方法getTop()获取ListView内的像素坐标。

标签: android


【解决方案1】:

在您的适配器中,保留与列表大小相同的第二个距离列表。在您的构造函数中初始化它。然后,对于每个 getView() 调用,您可以将视图的高度添加到存储在此新列表的前一个索引处的值。例如,假设你有List<Integer> distances。当你用position = 0 调用getView(...) 时,你设置了distances.add(0 + view.getHeight());(一旦你的视图被初始化)。对于位置 1,您将使用 distance.add(distances.get(position-1) + view.getHeight); 等等。然后只需有一个方法来获取给定视图索引的距离,该方法返回存储在distances 中的该索引处的值。

【讨论】:

  • 这听起来像是正确的方法,但尝试这样做时,我发现我的适配器的 getView 调用保持高度为零。如果convertView 为null,我使用inflater.inflate 的标准方法,否则只使用convertView。知道发生了什么吗?
  • Hmm... 在其父级添加视图之前,它可能不会设置其高度。这个问题有解决办法:stackoverflow.com/questions/5375631/…
  • 这行得通,但微妙之处在于您必须在适配器的 getView 函数中调用 measure (根据您的链接)。谢谢你的建议。
  • 取消接受的答案 - 我的意思是,我认为你仍然有正确的想法,但是这些元素的高度会发生变化 - getHeight() 有时仍然为零。而且我还没有弄清楚。
  • @mdkess,这很容易成为一个不同的问题。根据我发送给您的链接,该解决方案对很多人都有效,正如您所说,这是正确的想法。从经验来看,如果您发布一个新问题,链接上面链接的问题并显示您当前的代码,那么您将有更好的运气。
【解决方案2】:

可以通过调用 方法 getLeft() 和 getTop()。前者返回左边,或 X, 表示视图的矩形的坐标。后者返回 表示视图的矩形的顶部或 Y 坐标。 这些方法都返回视图相对于它的位置 父母。例如,当 getLeft() 返回 20 时,这意味着视图 位于其直接左边缘右侧 20 像素处 父母。

此外,还提供了几种方便的方法来避免 不必要的计算,即 getRight() 和 getBottom()。这些 方法返回右边缘和下边缘的坐标 代表视图的矩形。例如,调用 getRight() 是 类似于以下计算:getLeft() + getWidth()(参见 Size 有关宽度的更多信息。)

http://developer.android.com/reference/android/view/View.html

使用 getItemAtPosition() 检索视图

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 2011-11-28
    • 1970-01-01
    • 2021-01-23
    相关资源
    最近更新 更多