Одним из подходов может быть использование smoothScrollToPosition, которое останавливает любое существующее движение прокрутки. Обратите внимание, что для этого метода требуется уровень API> = 8 (Android 2.2, Froyo). Обратите внимание, что если текущая позиция находится далеко от желаемой позиции, то плавная прокрутка займет довольно много времени и выглядит немного отрывистым (по крайней мере, в моем тестировании на Android 4.4 KitKat). Я также обнаружил, что комбинация вызова setSelection и smoothScrollToPosition иногда может заставлять позицию «пропустить» немного, это, похоже, происходит только тогда, когда текущая позиция была очень близка к желаемой позиции.
В моем случае я хотел, чтобы мой список прыгнул вверх (позиция = 0), когда пользователь нажал кнопку (это немного отличается от вашего варианта использования, поэтому вам нужно будет адаптировать это к вашим потребностям).
Я использовал следующий метод
private void smartScrollToPosition(ListView listView, int desiredPosition) {
// If we are far away from the desired position, jump closer and then smooth scroll
// Note: we implement this ourselves because smoothScrollToPositionFromTop
// requires API 11, and it is slow and janky if the scroll distance is large,
// and smoothScrollToPosition takes too long if the scroll distance is large.
// Jumping close and scrolling the remaining distance gives a good compromise.
int currentPosition = listView.getFirstVisiblePosition();
int maxScrollDistance = 10;
if (currentPosition - desiredPosition >= maxScrollDistance) {
listView.setSelection(desiredPosition + maxScrollDistance);
} else if (desiredPosition - currentPosition >= maxScrollDistance) {
listView.setSelection(desiredPosition - maxScrollDistance);
}
listView.smoothScrollToPosition(desiredPosition); // requires API 8
}
В моем обработчику для кнопки, то я назвал это следующим образом
case R.id.action_go_to_today:
ListView listView = (ListView) findViewById(R.id.lessonsListView);
smartScrollToPosition(listView, 0); // scroll to top
return true;
Приведенный выше непосредственно не ответить на ваш вопрос, но если вы можете когда текущая позиция находится на нужной позиции или рядом с ней, возможно, вы можете использовать smoothScrollToPosition, чтобы остановить прокрутку.