listview滑动到指定坐标位置

来源:互联网 发布:2016淘宝女装排行榜 编辑:程序博客网 时间:2024/04/26 00:30
我们都知道让listview滑动到指定的item位置有两个直接调用的方法setSelection(int position)和
smoothScrollToPosition(int position),第二个smooth方法是带平滑滑动动画的,看起来更顺滑一些,不过他要在线程中调用才能起作用。

他们两个共同的弊端就是只能滑动到某个item,不能指定滑动到某个固定的坐标位置,
在这里我们可以通过lv.smoothScrollBy(int distance, int duration)方法来解决这个弊端,
第一个参数distance是滑动的距离,正数是向上滑动,负数是向下滑动。
第二个参数duration是滑动的时间

知道调用smoothScrollBy需要传入滑动的距离,下边我们就来看一下滑动的距离怎么获取,在listview中我们通过实现OnScrollListener接口,在方法中
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,int totalItemCount) {
//获取滑动的高度
int scrollHeight = getScrollYs();
}
//用来记录每一个item的高度
private HashMap<Integer,Integer> itemHeight = new HashMap<>();

/**
* 获取ListView的ScrollY
* @return
*/
public int getScrollYs() {
View c = getChildAt(0);
if (c == null) {
return 0;
}
int firstVisiblePosition = getFirstVisiblePosition();
if (!itemHeight.containsKey(firstVisiblePosition)){
itemHeight.put(firstVisiblePosition,c.getHeight());
}
int top = c.getTop();
int height = 0;
Set<HashMap.Entry<Integer,Integer>> entry = itemHeight.entrySet();
for (HashMap.Entry<Integer,Integer> entrys: entry){
if (entrys.getKey()<firstVisiblePosition){
height += entrys.getValue();
}
}
return -top + height ;
}

这样获取到滑动的高度(- scrollY)- 需要到达的高度坐标(y)=需要滑动的距离distance。
注意:这里获取到的高度是取的正数,是加了“ - ”的,在计算距离的时候可以根据需要在scrollY 前 加上 “ - ”转换成真实头部坐标来计算距离。

只要了解了调用方法,使用起来还是比较简单的,相信看完的程序猿们应该都清楚怎么使用了。