Подождать unitl ListView smoothScrollToPosition() завершает - программирование
Подтвердить что ты не робот

Подождать 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();
4b9b3361

Ответ 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) остановит плавную прокрутку перед правильной настройкой выбора и сразу.