说明:
总:判断Listview滑动到了最底部和最顶部
顶部判断:
firstVisibleItemView != null --- 仅仅有这行代码只是判断出了第一个可见,但是第一个有高度,在第一个高度内不能判断是否真正的到订不了,所以要加上代码:firstVisibleItemView.getTop() == 0
代码:
1、外部系统ListView写法
mListView.setOnScrollListener(new OnScrollListener() { @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { //判断顶部底部 if (firstVisibleItem == 0) { View firstVisibleItemView = mListView.getChildAt(0); if (firstVisibleItemView != null && firstVisibleItemView.getTop() == 0) { Log.d("ListView", "##### 滚动到顶部 #####"); } } else if ((firstVisibleItem + visibleItemCount) == totalItemCount) { View lastVisibleItemView = mListView.getChildAt(mListView.getChildCount() - 1); if (lastVisibleItemView != null && lastVisibleItemView.getBottom() == mListView.getHeight()) { Log.d("ListView", "##### 滚动到底部 ######"); } } //判断滑动 if (firstVisibleItem < lastVisibleItemPosition) { // 上滑 } else if (firstVisibleItem > lastVisibleItemPosition) { // 下滑 } } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { //do nothing } });
2、内部自定义listview写法
下面是我为了解决下拉刷新和listview滑动冲突写的自定义listview,里面用到了监听到头部了
/** * 和下拉刷新配合的listview */ public class PullListView extends ListView { public PullListView(Context context) { super(context); } public PullListView(Context context, AttributeSet attrs) { super(context, attrs); } public PullListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { if (getFirstVisiblePosition() == 0 && getChildAt(0).getTop() == 0) {//到头部了 getParent().requestDisallowInterceptTouchEvent(false);//放行 } else { getParent().requestDisallowInterceptTouchEvent(true);//拦截 } return super.onInterceptTouchEvent(ev); } }
问题:
实际使用的时候,ListView未滚动触发onScroll,比如只有一个item,listview的onScroll会被处罚等,解决这个问题可以参考这篇文章: