如何获得ListView当前的滚动速度

设想如下一个场景,有一个显示大量图片的ListView,为了让图片的加载更流畅,我希望在滚动速度很快的时候暂时不去加载和显示图片,而当滚动速度小于某个值时才去加载。这就需要获得ListView的滚动速度,但是ListView并没有直接提供这样的方法。

但是我们可以通过一个比较巧妙的方式获得能代表这个速度快慢的值:

原理:给ListView添加OnScrollListener然后在OnScrollListener的onScroll方法中根据firstVisibleItem参数变化时的时间差来获得一个速度:

实现如下:

private OnScrollListener onScrollListener = new OnScrollListener() {
    private int previousFirstVisibleItem = 0;
    private long previousEventTime = 0;
    private double speed = 0;
    @Override
    public void onScroll(HtcAbsListView view, int firstVisibleItem,
            int visibleItemCount, int totalItemCount) {
        if (previousFirstVisibleItem != firstVisibleItem){
            long currTime = System.currentTimeMillis();
            long timeToScrollOneElement = currTime - previousEventTime;
            speed = ((double)1/timeToScrollOneElement)*1000;
            previousFirstVisibleItem = firstVisibleItem;
            previousEventTime = currTime;
            Log.d("DBG", "Speed: " +speed + " elements/second");
        }
    }
    @Override
    public void onScrollStateChanged(HtcAbsListView view, int scrollState) {
    }
};

speed即为我们所需要的值,虽然他并不真正是ListView的速度本身,但是它的大小能体现出ListView的快慢,对于上面提到的场景来说已经足够了。

这种方式是目前我找到的最好方式。