android listview 每次滑动整行

原:http://www.easymorse.com/index.php/archives/1605

需求:listview显示的第一行永远为整行,不能为半行。

思路:大家都知道listview滑动时可以停留在任何位置。现在需要控制当listview滑动结束时,判断第一行处在什么位置。如果屏幕外的高度小于第一行自身的高的一半时,则向下滚动到第一行显示全,反之则向上滚动到下一行显示全。

方法:

1、在OnScrollListener中监控滚动停止时

AbsListView.OnScrollListener.SCROLL_STATE_IDLE获取当前显示的第一行高度height,得到当前显示的第一行top值。

2、判断top > (height / 2)执行smoothScrollBy(height – top, 200);

3、如果!(top > (height / 2))执行view.smoothScrollBy(-top, 200);

listView.setOnScrollListener(new AbsListView.OnScrollListener() {
 
@Override
public void onScrollStateChanged(final AbsListView view, int scrollState) {
switch (scrollState) {
case AbsListView.OnScrollListener.SCROLL_STATE_FLING:
Log.e(“tag”, “SCROLL_STATE_FLING”);
break;
case AbsListView.OnScrollListener.SCROLL_STATE_IDLE:
Log.e(“tag”, “SCROLL_STATE_IDLE”);
int firstPostion = view.getFirstVisiblePosition();
View firstChild = view.getChildAt(0);
final int height = firstChild.getHeight();
final int top = -(firstChild.getTop());
if (top > (height / 2)) {
Log.e(“tag”, “firstPostion = ” + firstPostion);
// view.smoothScrollToPosition(firstPostion + 1);
view.post(new Runnable() {
 
@Override
public void run() {
view.smoothScrollBy(height – top, 200);
}
});
 
} else {
view.post(new Runnable() {
 
@Override
public void run() {
view.smoothScrollBy(-top, 200);
}
});
}
Log.e(“tag”, “top = ” + top);
Log.e(“tag”, “height = ” + height);
break;
case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
Log.e(“tag”, “SCROLL_STATE_TOUCH_SCROLL”);
break;
default:
break;
}
}
 
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {}
});


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值