在 Gingerbread 中,我使用 smoothScrollToPosition() 一次滚动数十个项目没有任何问题。在我的 Nexus S 升级到 Ice Cream Sandwich 后,我注意到无论我在 smoothScrollToPosition() 中放入什么,它只会向任一方向滚动大约几百个像素,然后停止。
这是 ICS 的已知问题吗?我在 Galaxy Nexus 上也注意到了这一点。我查看了其他一些问题并尝试了一些不同的技巧,例如关闭对 notificationDataSetChanged() 的调用,并将 smoothScrollToPosition() 作为延迟的可运行对象发布,但不幸的是,它不想滚动超过停止前大约一百个像素。 :(
似乎是完成动画所需的持续时间的问题,smoothScrollBy(int distance, inturation) 也存在同样的问题,粗略地看,smoothScrollToPosition() 是 smoothScrollBy() 的一个友好包装,它做了很多工作跑腿。 smoothScrollBy() 反过来又伪造了一个“猛击手势”,就好像用户做出了该动作一样。
smoothScrollBy 实际上只是发布了 fling runnable,它会继续重新发布自身,直到持续时间用完。这意味着它只是根据之前决定移动到的偏移量来计算所需的滚动偏移量,因此如果持续时间在到达目标偏移量之前用完,它将在最后计算的偏移量处停止。 (而不是突然跳到目标偏移,这可能更刺耳,因为它不会被动画化)。
对于 Android 人员来说,困难在于确定每次 run() 调用要移动多少才能达到所需的偏移量,因为 ListView 单元格(子级)的高度完全是动态的,因此他们不能只进行简单的距离计算,因为可见儿童的身高对他们来说是未知的。这与 Android 滚动条在滚动时大小会波动的原因相同,它必须根据当前看到的内容来最佳猜测它应该有多大。
无论如何,这不能帮助您解决问题,但有人可能会觉得它很有趣:)
但是,如果您知道单元格高度是静态的,则可以编写自己的方法来计算自己传递给 smoothScrollBy() 的距离和持续时间,并拥有移动 X 距离的静态时间量。如果你不这样做,那么使用 bigstones 发布的解决方案就足够了,由于 SCROLL_DURATION 高达 1000 毫秒,该解决方案确实有效。您可以采用 ICS 版本并更改此属性,而不是使用 2.2 版本,这不是根本原因。
您还可以使用自己的自定义算法来调整这些可运行对象,调整事情应该不会太困难。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)