1.为了实现相似IOS点击状态栏,列表回滚到顶部的功能(要平滑滚动效果),android上点击一个按钮或是图片什么的也可让listview一次性滚动到顶部(滑动太多页时,一次可能滚不到顶部,使用handler定时监听,继续滚动,直至回到顶部)android
public static void scrollToListviewTop(final AbsListView listView)
{
listView.smoothScrollToPosition(0);
final Handler handler = new Handler();
handler.postDelayed(new Runnable()
{
@Override
public void run()
{
if (listView.getFirstVisiblePosition() > 0)
{
listView.smoothScrollToPosition(0);
handler.postDelayed(this, 100);
}
}
}, 100);
}ide
此方法的优势是:适用于任何的listview(item单同样式的,多种样式的均可以),并且不存在界面显示问题post
缺点是:滑动数据量很大时,回滚时间会比较长。改进办法是将handler里的这两行代码:this
listView.smoothScrollToPosition(0);
handler.postDelayed(this, 100);spa
换成:code
listView.setSelection(0);再根据须要修改间隔时间(100毫秒),就完美啦~~~图片
2.对于单同样式且数据较少的listview,滑动中止时能够计算出滚动的高度,回滚时使用listView.smoothScrollBy(getScrollY(), 500);get
listview滚动高度原理是假设每一个item的高度是必定的(多数状况下的确如此),那么只要知道当前在第几个item,就能够计算出总的高度,由于第一个可见item的一部分可能已经移出了边界,因此再经过mListView.getChildAt(0)得到第一个子view,使用
itgetTop()方法计算出这个误差(获得的通常是负数)。由于是回滚,因此最后滚动距离要是负数,另外可能会有必定的偏差,适当的加上个负数,综合起来就能够计算出当前ListView的滚动高度。这种滚动效果比较天然,快到顶部时滚动速度愈来愈慢,最后中止。
public int getScrollY()
{
View c = listView.getChildAt(0);
if (c == null)
{
return 0;
}
int firstVisiblePosition = listView.getFirstVisiblePosition();
int top = c.getTop();
if (firstVisiblePosition == 0)
{
return top;
}
else
{
return top - (firstVisiblePosition - 1) * c.getHeight() - 17;
}
}io
3.若是只要求回到顶部,不须要滚动效果的话,很简单,只须要调用listview.setSelection(0)就ok了。
………………………………………………………………华丽的分割线………………………………………………………………………………
ps:顺便记一下修改listview快速滚动滑块的方法:
try { Field f = AbsListView.class.getDeclaredField("mFastScroller"); f.setAccessible(true); Object o = f.get(listView); f = f.getType().getDeclaredField("mThumbDrawable"); f.setAccessible(true); Drawable drawable = (Drawable) f.get(o); drawable=context.getResources().getDrawable(R.drawable.transparent); f.set(o, drawable); } catch (Exception e) { LogUtils.error(e + ""); }