2014-11-14 20 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回调。