Android 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开头的也是直接移到目标位置。
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。

你可能感兴趣的:(Android Listview 自动滚动方法总结)