之前的項目使用了HorizontalListView,要實現滑動到最后一個條目的功能。起初以為和listview一樣直接setSelect()即可,但是並沒有什么卵用,翻看源碼發現竟然是這樣寫的:
@Override public void setSelection(int position) { //TODO: implement }
額,難怪呢....
這咋辦,自己寫?不,我們要去找現成的輪子,一番搜索后發現如下代碼:
@Override public void setSelection(int position) { int positionX = position * this.getWidth(); int maxWidth = this.getChildCount() * this.getWidth(); if (positionX <= 0) { positionX = 0; } if (positionX > maxWidth) { positionX = maxWidth; } scrollTo(positionX); }
大概瞅了下,不太對勁。沒細想,直接復制過去開搞。結果emmm,誰貼的坑爹玩意,仔細一看心中一萬頭草泥馬奔騰而過。槽點太多,不一一吐槽。直接改起:
@Override public void setSelection(int position) { View childAt = getChildAt(0); if(null == childAt){ return; } int positionX = position * childAt.getWidth(); int maxWidth = this.getChildCount() * childAt.getWidth(); if (positionX <= 0) { positionX = 0; } if (positionX > maxWidth) { positionX = maxWidth; } scrollTo(positionX); }
此乃正確之道,真實測試,童叟無欺,歡迎拍磚。
又發現少量數據時是正常的,數據量比較大的時候就不正確了。還是控件太老了,考慮上新的控件。