Появляется проблема с продолжительностью, необходимой для завершения анимации, эта же проблема присутствует с smoothScrollBy (int distance, int duration), при беглом взгляде smoothScrollToPosition() - дружественная оболочка вокруг smoothScrollBy() который делает много работы. smoothScrollBy(), в свою очередь, притворяется «бегущим жестом», как если бы пользователь совершил движение.
smoothScrollBy на самом деле просто помещает выполняемый бег, который продолжает пересказывать до истечения продолжительности Это означает, что он просто вычисляет смещение прокрутки, требуемое на основе смещения, которое ранее было решено переместиться, поэтому, если продолжительность истекает до того, как он достигнет смещения цели, он останавливается при вычислении последнего смещения (вместо того, чтобы внезапно прыгать к смещению цели, которое является perhap s более jarring, поскольку это не было бы анимировано).
Трудность для ребят из Android заключается в определении того, сколько нужно переместить при каждом вызове run() для достижения необходимого смещения, поскольку ячейки ListView (дети) полностью динамичны по высоте, поэтому они не могут просто выполнить простой расчет расстояния поскольку непонятная детская высота им неизвестна. Это та же самая причина, по которой полоса прокрутки Android может изменяться по мере прокрутки, она должна лучше понять, насколько она должна быть основана на том, что она сейчас видит.
В любом случае это не поможет вам решить эту проблему, но кто-то, возможно, это интересно :)
Если вы знаете, что статические высоты ячейки, однако, вы можете написать свой собственный метод для вычисления расстояния и продолжительности, чтобы пройти для smoothScrollBy() самостоятельно и иметь статическое количество времени для перемещения расстояния X. Если вы этого не сделаете, достаточно будет использовать широко распространенное решение bigstones, которое действительно работает из-за высокого SCROLL_DURATION в 1000 мс. Вы можете взять версию ICS и изменить этот атрибут, а не использовать версию 2.2, которая не является основной причиной.
Вы также можете адаптировать эти runnables своим собственным алгоритмом, это не должно быть слишком сложно подстроить.
У меня такая же проблема. http://code.google.com/p/android/issues/detail?id=37278 – bigstones
Я разместил там обходной путь. – bigstones
Кажется, что исправлено в Jellybean. –