smoothScrollToPosition()仅在Android ICS中滚动?

Lea*_* ES 5 android android-4.0-ice-cream-sandwich

在Gingerbread中,我没有使用smoothScrollToPosition()一次滚动数十个项目的问题.在我的Nexus S升级为Ice Cream Sandwich之后,我注意到无论我在smoothScrollToPosition()中放置什么,它都只会在任一方向上滚动大约几百个像素,然后停止.

这是ICS的已知问题吗?我也注意到Galaxy Nexus.我已经看了几个其他的问题并尝试了一些不同的技巧,比如关闭对notifyDataSetChanged()的调用,并将smoothScrollToPosition()作为延迟的runnable发布,但不幸的是,它不想滚动多于一个停止前一百个像素左右.:(

小智 12

似乎是完成动画所需的持续时间的问题,smoothScrollBy(int distance,int duration)存在同样的问题,粗略地看一眼,smoothScrollToPosition()是smoothScrollBy()的友好包装,它完成了很多跑腿.smoothScrollBy()反过来伪造一个"fling手势",好像用户做了动作一样.

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

Android人员的困难在于确定每次run()调用移动多少以达到所需的偏移量,因为ListView单元格(子项)的高度完全是动态的,因此它们不能像非可见儿童的身高对他们来说是未知的.这与滚动时Android滚动条的大小波动的原因相同,它必须根据当前看到的内容对其大小进行最佳猜测.

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

如果你知道你有静态单元格高度,你可以编写自己的方法来计算自己传递给smoothScrollBy()的距离和持续时间,并有一个静态的时间来移动X距离.如果你不这样做,那么就必须使用已发布的解决方案bigstones,因为170ms的SCROLL_DURATION很高,所以它确实有效.您也可以使用ICS版本并更改此属性,而不是使用2.2版本,这不是根本原因.

您也可以使用自己的自定义算法调整这些可运行的东西,调整内容应该不会太困难.