1. 程式人生 > >Android下拉重新整理PullToRefresh原始碼解讀

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