Как обнаружить Android ListView Scrolling остановлено?

Я пытаюсь сделать что-то после остановки прокрутки. Итак, я попытался использовать OnScrollListener#onScrollStateChanged(SCROLL_STATE_IDLE) для обнаружения, когда прокрутка остановилась (либо TOUCH_SCROLL or FLING) (в 1.5 она работает, как я ожидаю). Но когда он работает в версии 2.0, onScrollStateChanged не может получить событие после отпускания пальца. Есть ли какой-либо обратный вызов или, во всяком случае, для обнаружения этого события?

Ответ 1

Попробуйте использовать setOnScrollListener и реализуйте onScrollStateChanged с помощью scrollState == 0... сделайте то, что вам нужно сделать...

setOnScrollListener(new OnScrollListener() {
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        // TODO Auto-generated method stub
    }

    public void onScrollStateChanged(AbsListView view, int scrollState) {
        if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
            Log.i("a", "scrolling stopped...");
        }
    }
});

Ответ 2

Трюк заключается в том, чтобы отслеживать, когда пользователь бросается, а когда нет. Похоже, это касается единственного различия, которое вы можете сделать, потому что, как вы сказали, переходы с прокрутки пальцем в режим ожидания не записываются. Вот о чем я говорю:

public void onScrollStateChanged(AbsListView view, int scrollState) {       
    if (scrollState != OnScrollListener.SCROLL_STATE_FLING) {
        flinging = false;
        int count = view.getChildCount();

        for (int i = 0; i < count; i++) {
            View convertView = view.getChildAt(i);
            Recipe recipe = (Recipe) convertView.getTag();
            ImageView image = (ImageView) convertView.findViewById(R.id.icon);

            if (recipe != null && recipe.getImageURL() != null) {
                ImageLoader.loadImage(this, image, recipe.getImageURL());
            }
        }
    } else {
        flinging = true;
    }
}

И затем в адаптере listView:

public View getView(int position, View convertView, ViewGroup parent) {
    // Bunch of code....

    if (!flinging) {
        ImageLoader.loadImage(BrowseRecipes.this, image, recipe.getImageURL());
    }
}

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

Все это вычеркнуто из моего проекта здесь: https://github.com/pkulak/mealfire_android