HorizontalListView实现水平滑动
之前的项目使用了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); }
此乃正确之道,真实测试,童叟无欺,欢迎拍砖。
又发现少量数据时是正常的,数据量比较大的时候就不正确了。还是控件太老了,考虑上新的控件。