1

为了提高列表滚动的性能,我实施了这个建议,它肯定会提高性能。

我的就是这样实现的

@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。但是,我想不出在滚动时确定滚动速度的好方法。任何帮助将非常感激。

4

2 回答 2

1

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

于 2012-07-12T01:32:42.207 回答
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) {}
}
于 2016-04-18T11:57:00.457 回答