public class HwgtListView extends ListView implements OnScrollListener {
public HwgtListView(Context context, AttributeSet attrs) {
super(context, attrs);
setOnScrollListener(this);
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
switch (scrollState) {
case OnScrollListener.SCROLL_STATE_IDLE:
Log.d("HWGT", "SCROLL_STATE_IDLE........");
break;
case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
Log.d("HWGT", "SCROLL_STATE_TOUCH_SCROLL........");
break;
case OnScrollListener.SCROLL_STATE_FLING:
Log.d("HWGT", "SCROLL_STATE_FLING........");
break;
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
Log.d("HWGT", "firstVisibleItem..=.."+firstVisibleItem +
" visibleItemCount..=.."+visibleItemCount +
" totalItemCount..=.."+totalItemCount);
}
}
由于我们主要是分析listview的滚动状态,所以只需要实现OnScrollListener接口,复写onScroll 和 onScrollStateChanged 两个方法。
//在onScroll方法中判断:
if (firstVisibleItem == 0) { // 只要第一个item有一小部分可见都会满足条件
View firstView = view.getChildAt(firstVisibleItem);
if (firstView != null) {
if(firstView.getTop()==0){ // 判断第一个item到顶部的距离
Log.d("HWGT", "滑动到顶部了,卧槽!");
}
}
}
上文已经分析过,仅仅只是判断if (firstVisibleItem == 0)是不太准确的,因为只要是第一个item只有很小的一部分可见,都会导致这个条件成立,所以还需要判断第一个item到屏幕顶部的距离,即(firstView.getTop()==0)。
//首先在onScroll方法中判断listview到达底部:
if ((firstVisibleItem + visibleItemCount) == totalItemCount) {
View lastVisibleItemView = view.getChildAt(view.getChildCount() - 1);
if (lastVisibleItemView != null) {
if(getHeight() == lastVisibleItemView.getBottom()){
Log.d("HWGT", getHeight()+"...滚到底部了...=.."+lastVisibleItemView.getBottom());
}
}
}
同理,仅仅只是判断 ((firstVisibleItem + visibleItemCount) == totalItemCount) 也是不准确的,
SCROLL_STATE_TOUCH_SCROLL........
SCROLL_STATE_FLING........
1845...滚到底部了...=..1845
SCROLL_STATE_IDLE........
而listview在手指拖动下到达底部的情况下,log的打印顺序是这样的:
SCROLL_STATE_TOUCH_SCROLL........
1845...滚到底部了...=..1845
SCROLL_STATE_FLING........
SCROLL_STATE_IDLE........
所以在onScrollStateChanged 方法中增加相应的标识再结合onScroll方法中的判断,就可以准确判断listview是由于惯性作用而到达底部的了。
滑动到顶部了
607...滚到底部了...=..607
SCROLL_STATE_TOUCH_SCROLL........
SCROLL_STATE_IDLE........
没有
SCROLL_STATE_FLING........
其实,在item很多且屏幕都显示不完的情况下,刚进入界面时也会在onScroll方法中打印log
滑动到顶部了
把这些特点利用起来,完成普通的需求,还是比较容易的。