我有一个ListView
,大约有100个条目。当用户从下到上进行“甩动”时,即使手指不再触摸显示器,它也会开始滚动并继续滚动。
有没有办法在此时停止滚动动画?
答案 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()
值作为参数。