2014-11-14 44 views
0

使用這個時,如果我滾動一小部分,爲什麼onScroll()調用20次左右,即每個firstVisibleItem需要5-6次。爲什麼不爲每個滾動操作調用一次?OnScoll在ListView中多次調用

listView.setOnScrollListener(new OnScrollListener() { 

      public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 

       Log.d("hey","called"+firstVisibleItem); 
      } 

      public void onScrollStateChanged(AbsListView view, int scrollState) { 


       } 
      } 
     }); 
+0

它正在偵聽任何滾動,而不僅僅是滾動的開始。 – zgc7009 2014-11-14 20:02:02

+0

@ zgc7009表示 - 滾動不是一個單一的動作,只有一個結果方法調用。滾動是一個連續的事件,並且該方法被連續調用。 – 2014-11-14 20:37:54

回答

-1

如果你看看ListView implentation,你可以看到mOnScrollListener.onScroll只調用ListView中一次,居然在invokeOnItemScrollListener()方法。

void invokeOnItemScrollListener() { 
    if (mFastScroll != null) { 
     mFastScroll.onScroll(mFirstPosition, getChildCount(), mItemCount); 
    } 
    if (mOnScrollListener != null) { 
     mOnScrollListener.onScroll(this, mFirstPosition, getChildCount(), mItemCount); 
    } 
    onScrollChanged(0, 0, 0, 0); // dummy values, View's implementation does not use these. 
} 

所以我們試試找一些invokeOnItemScrollListener()的用法。我們得到了很多,包括用於AbsListView。在AbsListView,invokeOnItemScrollListener()中間接調用onTouchMove方法。所以現在,應該清楚爲什麼你多次收到onScroll回調。