Android下拉刷新PullToRefresh源码解读

我是Android新手,我就先打算阅读优秀的开源项目来提高自己的水平,下面我将要把我自己解读的Android下拉刷新实现的基本步骤做一下我自己的解读

学习资料来源:http://blog.csdn.net/leehong2005/article/details/12567757

首先来看我的项目组成:


1.基本布局原理

示意图:


我的基本布局原理部分就是实现该界面,效果如下:


点击按钮后,会将头部的底部隐藏掉,当然不是简单的设置visibility为Gone,而是修改布局的尺寸来做到的,实现过程就是在自定义的LinearLayout中添加这三个部分

private void init(Context context, AttributeSet attrs) {
        mContext = context;
        setOrientation(LinearLayout.VERTICAL);
//        1.初始化并添加三个组件
        testContent = new TestContent(context);
        testHeader = new TestHeader(context);
        testFooter = new TestFooter(context);
        addView(testHeader);
        addView(testContent);
        addView(testFooter);
//        2、隐藏头部和尾部,这里为了掩饰方便,将隐藏步骤放在了Button的点击事件中,真正的框架中是初始化时就隐藏的
        mBtnHideHeadAndFoot = (Button) testContent.findViewById(R.id.btn_hide_head_and_foot);
        mBtnHideHeadAndFoot.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (isHeadAndFootHide) {
                    showHeadAndFoot();
                } else {
                    hideHeadAndFoot();
                }
                isHeadAndFootHide = !isHeadAndFootHide;
            }
        });
    }


2、简易的上拉下拉

我在第一部的基本布局的基础上实现下拉上拉来拖拽出头部和尾部,效果如下:

       

实现的步骤就是在1的基础上添加触摸事件的处理:

 @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
//        因为我在这个案例中没有加ListView等一系列的控件,所以这里直接返回true表示拦截
//        在真正的下拉刷新中,只有在中间的ListView等控件滑动到顶部或者地步的时候才拦截触摸事件
        return true;
    }

    /**
     * 上一次移动的点
     */
    private float mLastMotionY = -1;

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        boolean result = true;
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mLastMotionY = event.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                final float deltaY = event.getY() - mLastMotionY;
                mLastMotionY = event.getY();
                if (deltaY > 0) {
//                    向下滑动,拖拽出头部
                    pullHeaderLayout(deltaY);
                    result = true;
                } else {
//                    向上滑动,拖拽出尾部
                    pullFooterLayout(deltaY);
                    result = true;
                }
                break;
            case MotionEvent.ACTION_UP:
                resetHeaderLayout();
                break;
            default:
                break;
        }
        return result;
    }


3、在第二步的基础上再中间加入ListView,现在,一个上拉刷新的ListView就初具雏形了,效果如下:

     

实现原理就是在第二步的基础上对ListView的滑动位置坐一下判断,只有滑动到顶部或者底部的时候才拦截触摸事件:

 /**
     * 上一次移动的点
     */
    private float mLastMotionY = -1;

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
//        在实现简易的上拉下拉中,我们直接拦截了触摸事件,但是在这里不行
//        我们必须在ListView滑动到顶部或者底部的时候才能拦截事件
        boolean result = false;
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mLastMotionY = ev.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                final float deltaY = ev.getY() - mLastMotionY;
                if (deltaY > 0) {
//                    向下滑动
                    if (isFirstItemVisible()) {
                        result = true;
                    } else {
                        result = false;
                    }
                } else if (deltaY < 0) {
//                    向上滑动
                    if (isLastItemVisible()) {
                        result = true;
                    } else {
                        result = false;
                    }
                } else {
                    result = false;
                }
                break;
            case MotionEvent.ACTION_UP:
                break;
            default:
                break;
        }
        return result;
    }
那么到这里,我想关于下拉刷新已经知道怎么实现了,在完成的源码中只不过是加了刷新的监听器和各种标志位来控制刷新的过程


源码:http://download.csdn.net/detail/y280903468/9660932

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值