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)) {
view.scrollBy(0, visibleHeight + ((ListView)view).getDividerHeight());
} else {
view.scrollListBy(0, top);
}
}
}
@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();
}
}