为了提高列表滚动的效果,我有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来使视觉上更具吸引力。但是,我已经找不到确定滚动速度的好方法,而它正在滚动。任何帮助将不胜感激。
答案 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) {}
}