如何确定ListView fling何时放慢速度

时间:2012-07-12 01:26:08

标签: android performance android-listview baseadapter

为了提高列表滚动的效果,我有implemented this suggestion并且它肯定会提高性能。

我的实施是

@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
    switch (scrollState) {
        case OnScrollListener.SCROLL_STATE_IDLE:
            adapter.busy = false;
            adapter.notifyDataSetChanged();
            break;
        case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
            adapter.busy = true;
            break;
        case OnScrollListener.SCROLL_STATE_FLING:
            adapter.busy = true;
            break;
    }
}

但是,我想通过在列表滚动速度超过某个阈值时将adapter.busy设置为false来使视觉上更具吸引力。但是,我已经找不到确定滚动速度的好方法,而它正在滚动。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

你可以随时获得滚动位置。使用CountdownTimer定期检查最新的滚动位置,并与之前的滚动位置进行比较以确定方向和速度。如果它的移动速度过快则更新。实施后,请按上述结果发布。 (可能还有一个滚动位置更改事件,或者您可能会利用焦点事件更改来确定此事件)。

答案 1 :(得分:0)

有类似请求,以下内容适用于我。 只需要尝试MIN_VELOCITY

的最佳选择
@Override
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
                int totalItemCount) {

            checkFlingVelocitySlowDown(firstVisibleItem, totalItemCount);
        }

int mLastScrollInTopItemPosition = 0;
long mLastTimeTopPositionChanged = System.currentTimeMillis();
final double MIN_VELOCITY = 0.01;
final int TOP_VIEW_ITEMS_RANGE = 3;
final int BOTTOM_VIEW_RANGE = 6;

void checkFlingVelocitySlowDown(int scrollInTopItemPosition, int totalItemCount) {
    try {
        if (mLastScrollInTopItemPosition != scrollInTopItemPosition) {
            long now = System.currentTimeMillis();
            long timeSpan = now - mLastTimeTopPositionChanged;
            double velocity = (timeSpan > 0) ? (1.0 / timeSpan) : 1000000;
            mLastScrollInTopItemPosition = scrollInTopItemPosition;
            mLastTimeTopPositionChanged = now;

            if (velocity <= MIN_VELOCITY ||
                    scrollInTopItemPosition <= TOP_VIEW_ITEMS_RANGE ||
                    (Math.abs(totalItemCount - scrollInTopItemPosition) < BOTTOM_VIEW_RANGE)) {
                // to what ever it should do when scroll closer to top or bottom, or fling is slowing down
            }
        }
    } catch (Exception e) {}
}