Ответ 1
Я думаю, что есть ошибка, которая была зарегистрирована для этого случая.
У меня проблема с версией Android 2.1. Это похоже на ошибку.
Я прикрепил OnScrollListener
к моему спискуView.
Я использую метод onScrollStateChanged(AbsListView view, int scrollState)
для контроля состояния прокрутки моего списка.
Число прокрутки может принимать 3 значения (взятые из документации):
Я предполагаю, что SCROLL_STATE_IDLE всегда будет передаваться после одного из двух других состояний. Это всегда верно, за исключением версии для Android версии 2.1. SCROLL_STATE_IDLE не передается после SCROLL_STATE_TOUCH_SCROLL Проблема также возникает, если вы остановите бросок прикосновением, а не пропустите прокрутку самостоятельно. Это странное поведение оставляет мой listView в неконсолидированном состоянии.
У кого-то есть такая же проблема? Предложение об "не-грязной" работе?
Я думаю, что есть ошибка, которая была зарегистрирована для этого случая.
Я получил аналогичную проблему в версии 2.2.
Если список достаточно большой, и я прокручиваю вниз, я получил сначала CROLL_STATE_TOUCH_SCROLL, пока мой палец находится на экране. Когда мой палец покинул экран, я получил SCROLL_STATE_FLING. Когда мое представление остановилось, я получил SCROLL_STATE_IDLE.
Но, если во время прокрутки он достигает либо "Вид сверху", либо "Нижний", я только прокручиваю/переворачиваю значения и никогда не простаиваю.
Я проверил проект Shelves от Romain Guy, и его реализация страдает той же проблемой на 2.2.x Мне интересно, заметил ли он еще.
Я еще не пробовал с 2.3.x
Я нашел кое-что обходное решение для этого (по крайней мере для уровня API 9+, где я все еще вижу ошибку). Я использую GridView, но я считаю, что это также должно работать для ListView.
Я использую подкласс GridView, где я обнаруживаю прокрутку (сверху или снизу):
public class CustomGridView {
private boolean mIsOverScrolled = false;
@Override
protected void onOverScrolled(int scrollX, int scrollY,
boolean clampedX, boolean clampedY) {
mIsOverScrolled = true;
super.onOverScrolled(scrollX, scrollY, clampedX, clampedY);
}
public boolean isOverScrolled() {
return mOsOverScrolled;
}
public void clearOverScroll() {
mIsOverScrolled = false;
}
}
Затем в моем OnScrollListener из CustomGridView у меня есть:
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
int totalItemCount) {
if (gridView.isOverScrolled()) {
gridView.clearOverScroll();
}
// ...
}
Теперь, когда я проверяю OnScrollListener.SCROLL_STATE_IDLE
, я также проверяю, есть ли !gridView.isOverScrolled()
. Я не уверен, что это исправляет ваши конкретные варианты использования, но, надеюсь, вы можете использовать дополнительную информацию для определения вашего текущего состояния, несмотря на ошибку.
У меня была такая же проблема и выложил обходной путь в списке ошибок, упомянутом DeRagan: Ссылка