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

泡在网上的日子 / 文 发表于2014-09-18 13:17 次阅读 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的快慢,对于上面提到的场景来说已经足够了。

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

收藏 赞 (4) 踩 (1)
上一篇:fastScrollEnabled:ListView的快速滑动模式,以及滑块的自定义
一、显示ListView快速滑动块图标 设想这样一个场景,当ListView的内容有大于100页的情况下,如果想滑动到第80页,用手指滑动到指定位置,无疑是一件很费时的事情,如果想快速滑动到指定的位置,只需加上ListView的fastScrollEnabled属性等于true,启用快速滑
下一篇:android studio项目如何导入到eclipse中
下面是studio项目的目录结构: 打开src 目录 进入main 其实library的所有代码都在这里面了 而eclipse的结构是这样的 其实studio项目中java目录里面的代码对应的是eclispe项目中的src目录中的代码。而studio中src目录里面包括整个项目的所有代码包括资源文件