android-Ultra-Pull-To-Refresh下拉刷新框架使用注意點

大家都知道android-Ultra-Pull-To-Refresh是一個功能很強大的下拉刷新框架。

項目地址:https://github.com/liaohuqiu/android-Ultra-Pull-To-Refresh

原理剖析文檔:android-Ultra-Pull-to-Refresh

Demo地址:https://raw.githubusercontent.com/liaohuqiu/android-Ultra-Pull-To-Refresh/master/ptr-demo.apk

相信正常的使用都沒什么問題碟摆,但是有些點還是要注意的预厌。

1、自定義下拉頭部的幾個方法的調(diào)用時機:

/**
* 重置 View 攻谁,隱藏忙碌進度條稚伍,隱藏箭頭 View ,更新最后刷新時間戚宦。
* Content 重新回到頂部个曙, Header 消失,整個下拉刷新過程完全結(jié)束以后受楼,重置 View 垦搬。
*/
@Override
public void onUIReset(PtrFrameLayout ptrFrameLayout) {
}

/**
 * 準備刷新,隱藏忙碌進度條艳汽,顯示箭頭 View 猴贰,顯示文字,如果是下拉刷新骚灸,顯示“下拉刷新”糟趾,如果是釋放刷新,顯示“下拉”。
 * 準備刷新义郑,Header 將要出現(xiàn)時調(diào)用蝶柿。
 */
@Override
public void onUIRefreshPrepare(PtrFrameLayout ptrFrameLayout) {
}

/**
 * 開始刷新,Header 進入刷新狀態(tài)之前調(diào)用非驮。
 * 開始刷新交汤,隱藏箭頭 View ,顯示忙碌進度條劫笙,顯示文字芙扎,顯示“加載中...”,更新最后刷新時間填大。
 */
@Override
public void onUIRefreshBegin(PtrFrameLayout ptrFrameLayout) {
}

/**
 * 刷新結(jié)束戒洼,隱藏箭頭 View ,隱藏忙碌進度條允华,顯示文字圈浇,顯示“更新完成”,寫入最后刷新時間靴寂。
 * 刷新結(jié)束磷蜀,Header 開始向上移動之前調(diào)用。
 */
@Override
public void onUIRefreshComplete(PtrFrameLayout ptrFrameLayout) {
}

/**
 * 下拉過程中位置變化回調(diào)百炬。
 * <p>
 * 在拖動情況下褐隆,當下拉距離從 小于刷新高度到大于刷新高度 時,箭頭 View 從向下剖踊,變成向上庶弃,同時改變文字顯示。
 * 當下拉距離從 大于刷新高度到小于刷新高度 時蜜宪,箭頭 View 從向上虫埂,變?yōu)橄蛳拢瑫r改變文字顯示圃验。
 */
@Override
public void onUIPositionChange(PtrFrameLayout ptrFrameLayout, boolean b, byte b1, PtrIndicator ptrIndicator) {
   float percent = Math.min(1f, ptrIndicator.getCurrentPercent());
}

然后在自定義頭部的時候最好把布局也順便寫進去,這樣使用起來就比較方便一點:

public class CommonPtrHeader extends FrameLayout implements PtrUIHandler{
    private View headerView;
    private ProgressBar mProgressBar;

    public CommonPtrHeader(Context context) {
        super(context);
        init();
    }

    public CommonPtrHeader(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    private void init() {
        headerView = LayoutInflater.from(getContext()).inflate(R.layout.pull_to_refresh_head, this);
        mProgressBar = (ProgressBar) headerView.findViewById(R.id.pull_to_refresh_progress);
    }
}

2缝呕、當下拉刷新中有 ViewPager 時澳窑,比如 ListView 上面加個 Banner 廣告條,這時候其實是會有滑動沖突的供常,那么網(wǎng)上搜很多都說要重寫 ViewPager 或者 PtrFrameLayout摊聋,而且大部分都是達不到效果的,其實細心的你可能會發(fā)現(xiàn)栈暇,PtrFrameLayout 已經(jīng)提供好方法來解決這一問題了麻裁,只是我們平時比較容易忽略:

Q&A

好了,只需要這樣就能解決沖突了:

ptrFrame.disableWhenHorizontalMove(true);

-----------------------------分割線(補充)-------------------------------------------------------

上面說的設(shè)置 disableWhenHorizontalMove ,大家是不是發(fā)現(xiàn)好像沒什么用煎源,是的色迂,下面在網(wǎng)上找了個方法,使用中順利解決了沖突問題手销,而且好像還沒發(fā)現(xiàn)什么問題歇僧,需要重寫一下 PtrClassicFrameLayout ,下面是代碼:

public class FixPtrFrameLayout extends PtrClassicFrameLayout {

    private float startY;
    private float startX;
    // 記錄viewPager是否拖拽的標記
    private boolean mIsHorizontalMove;
    // 記錄事件是否已被分發(fā)
    private boolean isDeal;
    private ViewPager mViewPager;
    private int mTouchSlop;

    public FixPtrFrameLayout(Context context) {
        super(context);
    }

    public FixPtrFrameLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public FixPtrFrameLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    /**
     * PtrHTFrameLayout has a viewpager
     *
     * @param viewPager
     */
    public void setViewPager(ViewPager viewPager) {
        this.mViewPager = viewPager;
        if (mViewPager == null) {
            throw new IllegalArgumentException("viewPager can not be null");
        }
        final ViewConfiguration configuration = ViewConfiguration.get(getContext());
        mTouchSlop = ViewConfigurationCompat.getScaledPagingTouchSlop(configuration);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (mViewPager == null) {
            return super.dispatchTouchEvent(ev);
        }
        int action = ev.getAction();
        switch (action) {
            case MotionEvent.ACTION_DOWN:
                // 記錄手指按下的位置
                startY = ev.getY();
                startX = ev.getX();
                // 初始化標記
                mIsHorizontalMove = false;
                isDeal = false;
                break;
            case MotionEvent.ACTION_MOVE:
                // 如果已經(jīng)判斷出是否由橫向還是縱向處理锋拖,則跳出
                if (isDeal) {
                    break;
                }
                /**攔截禁止交給Ptr的 dispatchTouchEvent處理**/
                mIsHorizontalMove = true;
                // 獲取當前手指位置
                float endY = ev.getY();
                float endX = ev.getX();
                float distanceX = Math.abs(endX - startX);
                float distanceY = Math.abs(endY - startY);
                if (distanceX != distanceY) {
                    // 如果X軸位移大于Y軸位移诈悍,那么將事件交給viewPager處理。
                    if (distanceX > mTouchSlop && distanceX > distanceY) {
                        mIsHorizontalMove = true;
                        isDeal = true;
                    } else if (distanceY > mTouchSlop) {
                        mIsHorizontalMove = false;
                        isDeal = true;
                    }
                }
                break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                //下拉刷新狀態(tài)時如果滾動了viewpager 此時mIsHorizontalMove為true 會導(dǎo)致PtrFrameLayout無法恢復(fù)原位
                // 初始化標記,
                mIsHorizontalMove = false;
                isDeal = false;
                break;
        }
        if (mIsHorizontalMove) {
            return dispatchTouchEventSupper(ev);
        }
        return super.dispatchTouchEvent(ev);
    }
}

使用方法就是通過里面的 setViewPager 方法將你的 banner里面的 viewpager 賦值進去就好兽埃,如果你的 banne r是寫在 adapter 里面的侥钳,那你可以將 FixPtrFrameLayout 的實例賦值進去 adapter 里面,再設(shè)置 viewpager 就行柄错。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末慕趴,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鄙陡,更是在濱河造成了極大的恐慌冕房,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件趁矾,死亡現(xiàn)場離奇詭異耙册,居然都是意外死亡,警方通過查閱死者的電腦和手機毫捣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門详拙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蔓同,你說我怎么就攤上這事饶辙。” “怎么了斑粱?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵弃揽,是天一觀的道長。 經(jīng)常有香客問我则北,道長矿微,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任尚揣,我火速辦了婚禮涌矢,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘快骗。我一直安慰自己娜庇,他們只是感情好塔次,可當我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著名秀,像睡著了一般励负。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上泰偿,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天熄守,我揣著相機與錄音,去河邊找鬼耗跛。 笑死裕照,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的调塌。 我是一名探鬼主播晋南,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼羔砾!你這毒婦竟也來了负间?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤姜凄,失蹤者是張志新(化名)和其女友劉穎政溃,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體态秧,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡董虱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了申鱼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片愤诱。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖捐友,靈堂內(nèi)的尸體忽然破棺而出淫半,到底是詐尸還是另有隱情,我是刑警寧澤匣砖,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布科吭,位于F島的核電站,受9級特大地震影響脆粥,放射性物質(zhì)發(fā)生泄漏砌溺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一变隔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蟹倾,春花似錦匣缘、人聲如沸猖闪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽培慌。三九已至,卻和暖如春柑爸,著一層夾襖步出監(jiān)牢的瞬間吵护,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工表鳍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留馅而,地道東北人。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓譬圣,卻偏偏與公主長得像瓮恭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子厘熟,可洞房花燭夜當晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,858評論 25 707
  • 內(nèi)容抽屜菜單ListViewWebViewSwitchButton按鈕點贊按鈕進度條TabLayout圖標下拉刷新...
    皇小弟閱讀 46,737評論 22 665
  • 中國歷史長河中屯蹦,大肚子男人文化也頗有淵源。佛教中的彌勒佛陀绳姨,大多臂圓腰粗登澜。樂山大佛景區(qū)的對聯(lián),“大肚能容飘庄,容天下難...
    b7f6df1fafc7閱讀 1,044評論 2 0
  • 遇見你之前 我是一條魚 我是一名醫(yī) 我是一個妓 獨自長眠在萬丈深海 獨自徘徊在生死邊緣 獨自沉淪在燈紅酒綠 遇見你...
    燉只小雞兒閱讀 361評論 4 14