1. 程式人生 > >ListView滾動的方法

ListView滾動的方法

除了手動滑動Listview之外,用來滑動listview的方法有這麼幾個:


setScrollY(int Y)

setPostion(int position)

setPostionFromTop(int position, int offset)

scrollTo(int x, int y)

scrollBy(int x, int y)

scrollListBy(int y)

smoothScrollByOffset(int offset) 

smoothScrollBy(int distance, int duration)

smoothScrollToPosition(int position)

smoothScrollToPosition(int position, int boundPositon)

smoothScrollToPositionFromTop(int position, int offset)

smoothScrollToPositionFromTop(int position, int offset, int duration)

smoothScrollByOffset(int offset)

首先,y自然是指最上邊的縱座標,而Postion是指最上邊顯示的item標號。

set開頭的是移到目標位置。

scroll開頭的也是直接移到目標位置。

smoonth開頭的有動畫效果,滑動需要花費一定的時間。

我所遇到的坑就是採用smooth後,還有一個修改介面的處理,兩個互相沖突了,導致出現了奇怪的效果。

一開始我想著在smooth結束後來個回撥,在回撥中再來處理修改介面,但不知道如何來建立回撥。

之後通過為smooth設定好固定週期,並在這個週期後通過listview.post()來延時執行修改介面處理,從而消除了衝突。

下面是各方法的詳細介紹:

setScrollY(int Y),直接修改scrollY屬性,不會通知adapter更新資料,因而改變位置後可能會出現空白,且再點選一下又會返回到之前的位置,一般沒什麼用。

setPostion(int position),移動到最頂端編號為position的item,簡單粗暴,但適用場景有限。

setPostionFromTop(int position, int offset),在上面方法的基礎上還可以再移動offset畫素的偏移量,offset為正時為向上移動,能很好的應付不需要滑動動畫時的需求。

scrollListBy(int y),與setScrollY相比,此方法會通知adapter更新資料,但最低api需求為19。

scrollTo(int x, int y),一目瞭然,移動到座標為(x,y)的位置,與set方法相比,它還可以進行二維移動。

scrollBy(int x, int y),在當前的基礎上移動(x,y)的畫素距離。

smoothScrollByOffset(int offset) ,平緩的滑動到據當前編號差為offset的item,注意,這裡的offset指的是item編號差而不是畫素差,坑爹的樣子。

smoothScrollBy(int distance, int duration),這裡的distance指的是畫素了,平緩在duration毫秒內滑動distance的畫素差。

smoothScrollToPosition(int position),平緩滑動到編號為position的item。

smoothScrollToPosition(int position, int boundPositon),如果當前編號大於boundPosition才進行滑動,如果boundPosition為負時取絕對值。

smoothScrollToPositionFromTop(int position, int offset),類似setPostionFromTop,滑動到距編號為position的item畫素差為offset的位置。

smoothScrollToPositionFromTop(int position, int offset, int duration),在上面方法的基礎上限制了滑動時間為duration。

我最終採用的就是smoothScrollToPositionFromTop(int position, int offset, int duration),如果無需滑動動畫,推薦用setPostionFromTop(int position, int offset)。