如何检测Android ListView滚动停止?

27

我正在尝试在滚动停止后执行某些操作。因此,我尝试使用OnScrollListener#onScrollStateChanged(SCROLL_STATE_IDLE)来检测滚动何时停止(无论是TOUCH_SCROLL或FLING)(在1.5上按预期运行)。但是当它在2.0上运行时,在释放手指后,onScrollStateChanged无法接收事件。是否有任何回调或方法可以检测该事件?

2个回答

68

尝试使用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...");
        }
    }
});

23
不要硬编码等于0,使用OnScrollListener.SCROLL_STATE_IDLE。如果你想检测滚动停止时的情况,这将起作用。如果你想检测手指/快速滑动不再触摸屏幕的情况,那就需要采用不同的方法了。 - Vidar Vestnes

7

关键是要追踪用户何时在快速滑动,何时不在。因为像你说的那样,从用手指滚动到停止的转换是没有记录的,所以这似乎是唯一可以区分的情况。以下是我所说的内容:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接