自定义ScrollView--下拉刷新上滑底部自动加载更多

本文介绍给大家自己写的一个方便的下拉刷新上滑加载的自定义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
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值