Почекайте, як закінчить smoothView's smoothScrollToPosition ()

Сфера застосування

Мені необхідно прокручувати до певної позиції плавно, а потім "перейти" на іншу позицію за допомогою <�Код> setSelection (anotherPosition) . Це зроблено для створення ілюзії плавної прокрутки (наприклад,) 100 елементів у вікні <�Код> ListView . <�Код> smoothScrollToPosition (100) триває надто багато, ви знаєте.

Проблема

<�Код>setSelection() doesn't wait till <�Код>smoothScrollToPosition finishes its work, so <�Код>setSelection() is being called immediately and user sees quick jumping only;

Код

<���������������������������������������������������������������������������������������������������������������������

����

OK, we could change logic of smoothness illusion: first <�Код>setSelection(), then scroll smoothly (we're scrolling to the very first item on top of the list):

<�����������������������������������������������������������������������������������������������������������
15

2 Відповіді

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);

Звичайно, напрямок прокрутки і т. Д. Потрібно буде скорегувати для вашого випадку використання (перейдіть до верхньої частини списку)

EDIT: Old solution could overshoot if the velocity of the scroll was too high, smoothScrollBy(0,0) will stop the smooth scrolling before setting the selection properly and immediately.

24
додано
Так, його використовували лише для отримання достатньо високої швидкості. Поки ви замінюєте висоту * NUMBER_OF_VIEWS з будь-яким іншим відповідним чином великим значенням (тобто, якщо ваші погляди дуже різноманітні), ви отримаєте досить швидкий прокрут, який користувач не помітить, коли ви зачепитеся з setSelection (0) в Runnable, що PostDelayed до ListView.
додано Автор Jens, джерело
Дякую за відгук!
додано Автор Aleksey Malevaniy, джерело
Але це може бути рішення лише для списку із фіксованими об'єктами висоти. Я думаю, що mListView.setSelection (scrollableItems); mListView.smoothScrollToPosition (0); ще краще спосіб;)
додано Автор Aleksey Malevaniy, джерело

Інший спосіб - додати OnScrollListener.

private final int scrollableItems = 20;

int firstVisiblePosition = mListView.getFirstVisiblePosition();
if (firstVisiblePosition < scrollableItems) {
    mListView.smoothScrollToPosition(0);
} else {

    mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
      @Override
      public void onScrollStateChanged(AbsListView absListView, int i) {
        if (i == SCROLL_STATE_IDLE) {
          mListView.setSelection(0);
           }
      }
   })

   mListView.smoothScrollToPosition(firstVisiblePosition - scrollableItems);
}
mListView.clearFocus();
0
додано
android_jobs_ua
android_jobs_ua
120 учасників

Публикуем вакансии и запросы на поиск работы по направлению Android. Здесь всё: full-time, part-time, remote и разовые подработки.

Mobile Dev Jobs UA
Mobile Dev Jobs UA
20 учасників

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin, RN и т.д.