2011-06-16 143 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開始。