Android SmoothScroll, чтобы не вызывать onScrollStateChanged

#android #listview #scroll #event-driven

#Android #listview #прокрутка #управляемый событиями

Вопрос:

Я использую smoothScrollBy() для прокрутки до определенной позиции в ListView . Я хотел бы получать уведомления ListView о завершении прокрутки, чтобы интегрировать его с текущим onScrollStateChanged() событием, которое запускается, когда пользователь прокручивает пальцем.

В настоящее время я использую a Timer , который запускается через 100 мс после продолжительности плавной прокрутки, но это не так зависит от событий, как я бы предпочел.

Комментарии:

1. Я могу подтвердить из своей собственной отладки, что smoothScroll* функции не будут вызывать изменения состояния прокрутки и, следовательно, делать OnScrollListener.onScrollStateChanged() обратные вызовы бесполезными.

Ответ №1:

Если вы внедрили onscrollistener для вашего listview, вы можете следить за изменением состояния прокрутки. Используйте глобальное логическое значение (isScrolling), равное true при вызове smoothScrollBy(), а затем установите для него значение false, как только onScrollListener зарегистрирует состояние прокрутки SCROLL_STATE_IDLE .

 sidebar1.smoothScrollToPositionFromTop(currentPosition, 0, 500);
isScrolling = true;

sidebar1.setOnScrollListener(new OnScrollListener() {

@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
    if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
        isScrolling = false;
    }

}

@Override
public void onScroll(AbsListView view, int firstVisibleItem,
        int visibleItemCount, int totalItemCount) {

}
});
  

Комментарии:

1. К сожалению smoothScrollToPositionFromTop , появился в API 11.

2. Верно, но разве вы просто не хотите получать уведомления о завершении прокрутки? Вы должны иметь возможность использовать smoothScrollBy и реализовать прослушиватель в сочетании с циклом while, который непрерывно опрашивает состояние прокрутки.

3. По моему опыту, smoothScrollBy() не вызывает onScrollStateChanged() , и на данный момент я использую a Timer для опроса после завершения прокрутки.

4. Другой мыслью было бы опросить и проверить getLastVisiblePosition() как только это изменится, а затем останется неизменным, вы, вероятно, можете быть уверены, что прокрутка прекратилась. На самом деле он не управляется событиями, но должен выполнять работу довольно хорошо.

5. На Galaxy Tab 10.1 (Android 3.1) smoothScrollBy вызывает вызов onScrollStateChanged. Скорее всего, это также происходит на Huawei Media PadS7 — 301u (Android 3.2). В версии 2.x, afaik, smoothScrollBy не запускает onScrollStateChanged