項目用OnScrollListener 來檢測底部加載刷新,可是查看相關資料發現 在android2.3上邊lsitview偶爾爲正常通知已註冊的OnScrollListener java
當ListView滾動到最底部(最頂部)時,觸發了2.3新引入的視覺特效。這部分邏輯裏看到了特效相關的代碼,但卻沒找到通知reportScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE)的相關代碼。其它地方通知reportScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE)的地方伴隨着mTouchMode = TOUCH_MODE_REST,而特效代碼這裏卻只有mTouchMode = TOUCH_MODE_REST,無reportScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE),源碼以下: android
void startSpringback() { Log.d(tag, "simba startSpringback"); if (mScroller.springBack(0, mScrollY, 0, 0, 0, 0)) { mTouchMode = TOUCH_MODE_OVERFLING; invalidate(); post(this); } else { mTouchMode = TOUCH_MODE_REST; //這裏沒有調用下面註釋的代碼,致使ListView註冊的OnScrollListener不會獲得通知 //reportScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE); } }爲ListView設置一個OnTouchListener,在這個OnTouchListener中當MotionEvent的action等於 MotionEvent.ACTION_UP或者MotionEvent.ACTION_CANCEL時強制調用一次
public class lstt implement View.OnTouchListener{ private OnScrollListener myOnScrollListener ; public lstt(OnScrollListener listener){ myOnScrollListener = listener ; } @Override public boolean onTouch(View view,MotionEvent event){ final int action = event.getAction(); boolean mFinerUp = action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN ; if(mFinerUP){ myOnScrollListener.onScrollStateChange((AbsListview)view.onScrollListener.SCROLL_STATE_FLING) myOnScrollListener.onScrollStateChange((AbsListView)view.onScrollListener.SCROLL_STATE_IDLE); } } }
爲ListView設置自定義的OnTouchListener: spring
mListView.setOnTouchListener(new lstt(this));