2011-06-16 142 views
3

我有一个ListView约100条目。当用户从下到上进行“投掷”时,即使手指不再接触显示器,它也开始滚动并保持滚动。停止列表视图滚动动画

在这里有没有办法停止滚动动画?

回答

3

那么肯定有办法做到这一点。但我认为,关键是要做到这一点是否明智。

该列表是一个标准的Android控件,在所有应用程序中表现持续不变。所以如果我发现一个在应用程序中表现不一样的列表,我会感到惊讶。您可以随时将手指放回屏幕上以停止投掷。这就是说,如果你想做额外的工作,你可以继承列表视图并覆盖它的触摸方法。知道该怎么做的最好方法是获取ListView的源代码(ListView in Android 1.6)。

+1

我会回应MarvinLabs关于保持您的列表与用户*期望*工作方式一致的意见。 – 2011-06-16 09:30:36

0

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

但是,你的问题。我没有尝试过,但理论上它应该起作用。

执行OnScrollListener到您的ListView并使用onScrollStateChanged()方法检查当前状态是否为SCROLL_STATE_FLING。在确定一次掷骰的滚动操作之后,您可以使用getFirstVisiblePosition()方法获得ListView的第一个可见位置,然后可以使用smoothScrollToPosition(),将值作为参数。

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) { 
      } 
     } 
    } 
} 
+0

谢谢,这对我真的很有用。原生的Android小部件也这样做(这只是一个猜测......):如果您将一个listview放入viewpager并抛出列表,然后向左滑动,则pager将手动停止滚动。 – sydd 2011-12-06 04:24:46

+0

这是我见过的最好的解决方案。谢谢 – Adem 2012-10-31 14:05:37

+0

我是新的android解释完整的代码..请问 – arul 2014-01-23 08:57:22

15

,我们查找了Android的源代码(AbsListView),给它一个ACTION_CANCEL的TouchEvent,可以停止一扔。这很容易。

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

这是正确的答案。这应该被接受,因为它没有任何反思。好的工作伙伴! – 2014-01-23 20:23:14

3

您可以通过重写onTouchEvent并调用smoothScrollBy来防止API 8中的ListViews抛出。

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

取而代之的是从投掷滚动和滚动0px开始。