本文介绍给大家自己写的一个方便的下拉刷新上滑加载的自定义ScrollView;
直接上干货(详解在代码注释中给出):
public class RefreshScrollView extends ScrollView{
/**
* 重写构造函数,这里不是重点
*/
public RefreshScrollView(Context context) {
this(context,null);
}
public RefreshScrollView(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public RefreshScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
viewWidth = getWidth(); //获取ScrollView的宽度用来设置头布局的宽度
}
private int down_y; //按下时候的y坐标
private int scroll_y; //ScrollView的滑动距离
private View headViewRefresh; //头布局
private RefreshListener listsner; //刷新加载数据监听
private boolean b_down; //是否可以刷新
private int viewWidth; //scrollView宽度
private int headViewHeight; //头布局刷新时的高度
/**
* 设置刷新头布局
* @param view
*/
public void setHeadView(View view){ //在引用此自定义ScrollView的activity中传入初始化完成的头布局文件
this.headViewRefresh = view;
this.headViewHeight = UIUtil.dip2px(getContext(),50); //dp转px,px转dp工具,下文给出
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) headViewRefresh.getLayoutParams();
params.width = viewWidth;
params.height = 0;
headViewRefresh.setLayoutParams(params); //将headView的高度重新设置为0,也就是不可见,为什么这么设置?下文会介绍
}
/**
* 提供给调用scrollView的页面的刷新加载回调方法
* @param listsner
*/
public void setListsner(RefreshListener listsner){ //回调接口下文给出
this.listsner = listsner;
}
/**
* 刷新停止,给scrollView外部调用
*/
public void stopRefresh() {
listsner.hintChange("下拉刷新"); //停止刷新之后,将提示文字设置成初始值,时刻准备着下次刷新
// headViewRefresh.setVisibility(View.GONE); //隐藏headView
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) headViewRefresh.getLayoutParams(); //将headView的高度重新设置为1
params.width = viewWidth;
params.height = 0;
headViewRefresh.setLayoutParams(params); //设置头布局的高度为0,也就是隐藏头布局
}
@Override
protected void onScrollChanged(int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
super.onScrollChanged(scrollX, scrollY, oldScrollX, oldScrollY);
scroll_y = scrollY; //监听赋值,监听scrollView的滑动状态,当滑动到顶部的时候才可以下拉刷新
if(scrollY == 0){
}else if(scrollY+this.getMeasuredHeight() == this.getChildAt(0).getMeasuredHeight()){ //滑动距离+scrollView的高度如果等于scrollView的内部子view的高度则证明滑动到了底部,则自动加载更多数据
listsner.loadMore(); //加载更多
}
}
@Override
public boolean dispatchTouchEvent(MotionEvent e