ListView滑動到指定位置smoothScrollToPositionFromTop

開發需求:listView平滑滑動到指定位置,然後彈出一個展開框;
1.爲了“平滑滑動”,於是我把寫好的setSelection(position)改成smoothScrollToPosition(int position),可是死活找不到smoothScrollToPosition(int position)動畫end監聽,沒有這個監聽的話 無法獲知何時彈出展開框。
2.如果要知道smooth的動畫時長就好了,於是找到smoothScrollToPositionFromTop(int position, int offset, int duration);第三個參數就是動畫時長;
3.測試發現該方法也有坑,並不是每次都平滑滑動到指定位置。但是知道時長就好辦了。那就結束時,手動用setSelection(position)強行糾正下即可。代碼如下:


        listView.smoothScrollToPositionFromTop(pos, 0, 300);
        listView.postDelayed(new Runnable() {
            @Override
            public void run() {
                listView.setSelection(pos);
            }
        }, 300 + 50);
        

另外附上listView一些滾動方法:

在Android中,除了手動滑動 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開頭的也是直接移到目標位置。
smooth開頭的有動畫效果,滑動需要花費一定的時間。
我所遇到的坑就是採用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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章