停止ListView滚动动画

时间:2011-06-16 09:11:07

标签: android listview scroll android-listview

我有一个ListView,大约有100个条目。当用户从下到上进行“甩动”时,即使手指不再触摸显示器,它也会开始滚动并继续滚动。

有没有办法在此时停止滚动动画?

5 个答案:

答案 0 :(得分:16)

我们查找android源代码(AbsListView),给它一个ACTION_CANCEL touchEvent,可以停止fling。这很容易。

listView.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_CANCEL, 0, 0, 0));

答案 1 :(得分:9)

我没有尝试Pompe de velo的解决方案,但由于smoothScrollToPosition()不适用于低于8的API级别,因此这对我无效。

我同意,更改默认行为是一个好主意,但有时您需要。所以这是我的(脏)解决方案,它使用反射。这是迄今为止不推荐的方式,因为它是一个黑客但它适用于我。可能有更好的解决方案,但我没有找到它。

class StopListFling {

    private static Field mFlingEndField = null;
    private static Method mFlingEndMethod = null;

    static {
        try {
            mFlingEndField = AbsListView.class.getDeclaredField("mFlingRunnable");
            mFlingEndField.setAccessible(true);
            mFlingEndMethod = mFlingEndField.getType().getDeclaredMethod("endFling");
            mFlingEndMethod.setAccessible(true);
        } catch (Exception e) {
            mFlingEndMethod = null;
        }
    }

    public static void stop(ListView list) {
        if (mFlingEndMethod != null) {
            try {
                mFlingEndMethod.invoke(mFlingEndField.get(list));
            } catch (Exception e) {
            }
        }
    }
}

答案 2 :(得分:3)

那肯定有办法做到这一点。但在我看来,更重要的是做它是否明智。

该列表是一个标准的Android控件,在所有应用程序中都是一致的。如果我发现一个列表在您的应用程序中表现不一样,我会感到惊讶。您可以随时将手指放回屏幕上来停止投掷。

也就是说,如果你想做额外的工作,你可以继承列表视图并覆盖它的触摸方法。知道该怎么做的最好方法是获取ListView(ListView in Android 1.6)的源代码。

答案 3 :(得分:3)

您可以通过覆盖onTouchEvent并调用smoothScrollBy来阻止在API 8中弹出ListView。

@Override
public boolean onTouchEvent(MotionEvent ev) {
    switch (ev.getAction()) {
        case MotionEvent.ACTION_UP:
        this.smoothScrollBy(0, 0);
        break;
    }
    return super.onTouchEvent(ev);
}

这取代了滚动滚动并改为滚动0px。

答案 4 :(得分:0)

我的意见是你不应该修改这种行为,因为这种行为是用户期望的行为。

然而,对你的问题。我没试过这个,但理论上它应该有用。

ListView实施OnScrollListener并使用onScrollStateChanged()方法检查当前状态是否为SCROLL_STATE_FLING。在您确定滚动操作后,您可以使用getFirstVisiblePosition()方法获取ListView的第一个可见位置,然后您可以使用smoothScrollToPosition()放置您的getFirstVisiblePosition()值作为参数。