自定义View实战之
自定义实现监听滑动到底部的ScrollView
Android是默认没有提供监听ScrollView滑动到底部的API的,因此,如果我们需要监听ScrollView是否滑动到底部,我们需要自定义ScrollView。
先直接上代码:
public class ScrollBottomScrollView extends ScrollView {
private OnScrollBottomListener onScrollBottomListener;
private int calCount;
public ScrollBottomScrollView(Context context) {
super(context);
}
public ScrollBottomScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ScrollBottomScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public interface OnScrollBottomListener {
void scrollToBottom();
}
public void setOnScrollBottomListener(OnScrollBottomListener onScrollBottomListener) {
this.onScrollBottomListener = onScrollBottomListener;
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
View view = this.getChildAt(0);
if (this.getHeight() + this.getScrollY() == view.getHeight()) {
calCount++;
if (calCount == 1) {
if (onScrollBottomListener != null) {
onScrollBottomListener.scrollToBottom();
}
}
} else {
calCount = 0;
}
}
//另一种实现方式
/*@Override
protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) {
super.onOverScrolled(scrollX, scrollY, clampedX, clampedY);
if (scrollY != 0 && onScrollBottomListener != null) {
onScrollBottomListener.scrollToBottom(clampedY);
}
}*/
}
然后在业务代码里,
scrollView.setOnScrollBottomListener(new ScrollBottomScrollView.OnScrollBottomListener() {
@Override
public void scrollToBottom() {
//业务逻辑处理
}
});
现在,我们结合代码进行分析:
其实我们的思路是这样的,既然系统没有提供这样一个监听器给我们,那么我们就自定义ScrollView,我们自己写一个监听器,这样不就完了吗。然后我们再将这个监听器对外暴露出去。
我们再来讲一下核心:到底是如何监听到ScrollView滑动到了底部呢?其实有两种办法(上面的代码中都提到了),
办法一:
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
View view = this.getChildAt(0);
if (this.getHeight() + this.getScrollY() == view.getHeight()) {
calCount++;
if (calCount == 1) {
if (onScrollBottomListener != null) {
onScrollBottomListener.scrollToBottom();
}
}
} else {
calCount = 0;
}
}
办法二:
@Override
protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) {
super.onOverScrolled(scrollX, scrollY, clampedX, clampedY);
if (scrollY != 0 && onScrollBottomListener != null) {
onScrollBottomListener.scrollToBottom(clampedY);
}
}