// 给ListView设置一个滑动监听器,就可以把它变成WheelView
listView.setOnScrollListener(new AbsListView.OnScrollListener() {
/* 实现代码如下所示 */
});
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// 当滑动停止时
if(scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) {
View firstVisibleView = view.getChildAt(0);
int height = firstVisibleView.getHeight();
/**
* top为firstVisibleView与parent两者顶部的相对距离,单位为像素。
* Android的坐标轴原点在屏幕左上角,越往上y值越小。
* 由于firstVisibleView总是有部分不可见,
* 因此top的取值范围为:(-height, 0]
*/
int top = firstVisibleView.getTop();
int visibleHeight = top + height;
if(visibleHeight <= (height >> 1)) {
// 若firstVisibleView可见高度小于等于一半,则上滑直至不可见
view.scrollBy(0, visibleHeight + ((ListView)view).getDividerHeight());
} else {
// 若firstVisibleView可见高度大于一半,则下滑直至完全可见
view.scrollListBy(0, top);
}
// 调用scrollBy()之后,会引发onScroll()
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
int newMiddlePosition = firstVisibleItem + ((visibleItemCount - 1) >> 1);
if (mMiddlePosition != newMiddlePosition) {
mMiddlePosition = newMiddlePosition;
BaseAdapter adapter = ((BaseAdapter)view.getAdapter());
adapter.notifyDataSetChanged();
// 接着可以调用监听mMiddlePosition变化的自定义listener
}
}
时间: 2024-10-14 14:59:34