2011-08-19 57 views
1

我的网格有很多行(例如1 000 000)。每行的高度可能是唯一的。但大多数行具有相同的高度。所以无法确定每一行的高度并获得总的网格高度。用不同的行高计算网格中的滚动条高度

我需要在此网格上实现平滑的垂直滚动,不仅可以跳过行,因为行可以高于可见区域。

我的解决办法是:行

  1. 获取数
  2. 每行被分为10份
  3. =>滚动条最大值为(行数)×10
  4. 从滚动我得到的位置:
    • 第一个可见行=(滚动位置)/ 10
    • 第一个可见行移动=(滚动位置)% 10

这项工作很好,如果所有的行都具有+ - 相同的高度。如果有一个高度为500像素的行,其他像素为25像素滚动看起来很糟糕。

有人建议如何更好的解决这个问题?

电网是在这里: http://img560.imageshack.us/img560/7775/scroll.png

回答

0

让滚动在像素单位:

  • 总和所有行的总高度,并设置滚动条最大值为该值。
  • 缓存变量中的第一个可见行索引。
  • 当用户向上或向下滚动时,可以从当前第一个可见行开始顺序扫描以找到新行。这为连续读取每个更新提供了分摊的恒定时间工作。
  • 您不会频繁进行随机存取(例如,滚动至第N行),因此在您进行线性搜索时可以很好。如果你需要更快的东西(我怀疑它),那么你可以预先计算行高的部分总和并进行二分搜索。
+0

从数据库装载1 000 000行仅用于求和总高度是无效的。 – weny

+0

@weny:如果数据库未经常更新并始终以相同顺序显示,则可以将部分和存储在数据库中。对不起,但没有其他方法可以做到这一点(正确)。 – ybungalobill