gpt4 book ai didi

android - smoothScrollToPosition() 仅在 Android ICS 中滚动到一半?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:55:47 28 4
gpt4 key购买 nike

在 Gingerbread 中,我可以毫无问题地使用 smoothScrollToPosition() 一次滚动几十个项目。在我的 Nexus S 升级到 Ice Cream Sandwich 后,我注意到无论我在 smoothScrollToPosition() 中放入什么,它只会向任一方向滚动大约几百个像素,然后停止。

这是 ICS 的已知问题吗?我在 Galaxy Nexus 上也注意到了这一点。我查看了其他几个问题并尝试了一些不同的技巧,例如关闭对 notifyDataSetChanged() 的调用,并将 smoothScrollToPosition() 发布为延迟的可运行对象,但不幸的是,它不想滚动超过停止前一百个像素左右。 :(

最佳答案

似乎是完成动画所需持续时间的问题,smoothScrollBy(int distance, int duration) 也存在同样的问题,粗略地看一下,smoothScrollToPosition() 是 smoothScrollBy() 的友好包装器,它执行很多腿部工作。 smoothScrollBy() 反过来伪造一个“甩动手势”,就好像用户做出了这个 Action 。

smoothScrollBy 实际上只是发布了一个 fling runnable,它会继续重新发布自己,直到持续时间用完。这意味着它只是根据之前决定移动到的偏移量计算所需的滚动偏移量,因此如果持续时间在到达目标偏移量之前用完,它会在最后计算的偏移量处停止。 (而不是突然跳到目标偏移量,这可能更不和谐,因为它不会被动画化)。

Android 开发人员的难点在于确定每次 run() 调用要移动多少才能达到所需的偏移量,因为 ListView 单元格(子级)的高度完全是动态的,因此他们不能只进行简单的距离计算,因为不可见的 child 的高度是他们不知道的。这与 Android 滚动条在您滚动时大小会发生波动的原因相同,它必须根据当前看到的内容来最好地猜测它应该有多大。

无论如何,这并不能帮助你解决它,但有些人可能会觉得它很有趣:)

但是,如果您知道单元格高度是静态的,则可以自己编写方法来计算要传递给 smoothScrollBy() 的距离和持续时间,并有一个静态的时间量来移动 X 距离。如果不这样做,则必须使用 biggstones 发布的解决方案就足够了,由于 SCROLL_DURATION 为 1000 毫秒,该解决方案确实有效。您可以使用 ICS 版本并更改此属性,而不是使用 2.2 版本,这不是根本原因。

您还可以使用您自己的自定义算法调整这些可运行对象,调整内容应该不会太困难。

关于android - smoothScrollToPosition() 仅在 Android ICS 中滚动到一半?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11334207/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com