Подождать unitl ListView smoothScrollToPosition() завершает
Масштаб
Мне нужно прокручивать до определенной позиции гладко, а затем "прыгать" в другую позицию с помощью setSelection(anotherPosition)
. Это делается для создания иллюзии гладкой прокрутки (например,) 100 элементов в ListView
. smoothScrollToPosition(100)
длится слишком много, вы знаете.
Проблема
setSelection()
не дожидается, пока smoothScrollToPositio
n завершит свою работу, поэтому setSelection()
вызывается немедленно, и пользователь видит только быстрый переход;
код
private final int scrollableItems = 20;
int firstVisiblePosition = mListView.getFirstVisiblePosition();
if (firstVisiblePosition < scrollableItems) {
mListView.smoothScrollToPosition(0);
} else {
mListView.smoothScrollToPosition(firstVisiblePosition - scrollableItems);
mListView.setSelection(0);
}
mListView.clearFocus();
Идея
ОК, мы могли бы изменить логику иллюзии гладкости: сначала setSelection()
, затем прокрутите гладко (мы прокручиваем до самого первого элемента в верхней части списка):
int firstVisiblePosition = mListView.getFirstVisiblePosition();
if (firstVisiblePosition < scrollableItems) {
mListView.smoothScrollToPosition(0);
} else {
mListView.setSelection(scrollableItems);
mListView.smoothScrollToPosition(0);
}
mListView.clearFocus();
Ответы
Ответ 1
final ListView listView = ...;
View listItemView = ...;
listView.smoothScrollBy(listItemView.getHeight() * NUMBER_OF_VIEWS,
DURATION * 2);
listView.postDelayed(new Runnable() {
public void run() {
listView.smoothScrollBy(0, 0); // Stops the listview from overshooting.
listView.setSelection(0);
}
}, DURATION);
Конечно, направление прокрутки и т.д. нужно будет скорректировать для вашего варианта использования (перейдите в начало списка)
ИЗМЕНИТЬ: старое решение может перерегулировать, если скорость прокрутки была слишком высокой, smoothScrollBy (0,0) остановит плавную прокрутку перед правильной настройкой выбора и сразу.