打造Android萬能上拉下拉刷新框架--XRefreshView(三)


轉載請注明出處:http://blog.csdn.net/footballclub/

打造Android萬能上拉下拉刷新框架–XRefreshView(一)
打造Android萬能上拉下拉刷新框架–XRefreshView(二)

XRefreshView更新說明

這段時間一直有朋友給我反饋,讓我幫忙解決這個問題,我匯總了下,有以下幾種:
1. 處理listview滑動刪除與XRefreshView的沖突
2. 處理viewpager和XRefreshView的沖突
3. listview滑動究竟部自己主動載入很多其它
4. 刷新時,不讓里面的listview上下滑動
5. 自己定義headerview和footerview
6. 配置自己定義頭部廣告位
除了廣告位的都已經完畢了。除此之外,我還對默認的header和footer做了ui上的優化,特別地,鑒於Recylerview的強大,我還針對Recylerview做了特別的適配,接下來先看效果圖。在模擬器上錄的。有點卡卡的。

效果圖

效果圖

更新具體

1.處理橫向移動與XRefreshView的沖突

假設須要在手指橫向移動的時候。讓XRefreshView不攔截事件,

xRefreshView.setMoveForHorizontal(true);

能夠調用setMoveForHorizontal並傳入true就可以。

2.滑動究竟部自己主動載入很多其它

眼下僅僅做了Abslistview和Recylerview的

xRefreshView.setAutoLoadMore(false);

true會自己主動載入很多其它,false則相反。傳入false的話。假設是listview。須要上拉才干載入很多其它。假設是Recylerview。則會須要點擊才干載入很多其它。就像這樣
點擊載入很多其它
點擊載入很多其它涉及到自己定義footerview。到后面再說,這里先放着。

3.刷新時,不讓里面的列表上下滑動

假設刷新時不想讓里面的列表滑動。能夠這么設置

xRefreshView.setPinnedContent(true);

4.支持button點擊開始刷新

XRefreshView不僅支持手勢下拉刷新,也支持button點擊開始刷新。

xRefreshView.startRefresh();

能夠在activity的onResume()中調用。也能夠在button的點擊事件中調用。

5.設置Abslistview和Recylerview的滾動監聽事件

假設你有設置Abslistview和Recylerview滾動監聽事件的須要的話,就不能直接使用Abslistview和Recylerview的setOnScrollListener方法了。由於為了實現自己主動載入很多其它的功能。監聽已經被XRefreshView使用了,所以這時候須要使用XRefreshView提供的設置滾動監聽的方法

    /** * 設置Abslistview的滾動監聽事件 * * @param listener */
    public void setOnAbsListViewScrollListener(OnScrollListener scrollListener) {
        mContentView.setOnAbsListViewScrollListener(scrollListener);
    }

    /** * 設置Recylerview的滾動監聽事件 */
    public void setOnRecyclerViewScrollListener(
            RecyclerView.OnScrollListener scrollListener) {
        mContentView.setOnRecyclerViewScrollListener(scrollListener);
    }

6.設置載入很多其它

假設希望在載入很多其它數據的時候。能在沒有新數據的時候。隱藏footerview的話,

new Handler().postDelayed(new Runnable() {
                    public void run() {
                        //模擬數據載入完畢
                        if (mLoadCount >= 3) {
                            xRefreshView.setLoadComplete(true);
                        }
                        adapter.insert(new Person("More ", "21"),
                                adapter.getAdapterItemCount());
                        adapter.insert(new Person("More ", "21"),
                                adapter.getAdapterItemCount());
                        adapter.insert(new Person("More ", "21"),
                                adapter.getAdapterItemCount());
                        mLoadCount++;
                        //刷新完畢必須調用此方法停止載入
                        xRefreshView.stopLoadMore();
                    }
                }, 1000);

當調用xRefreshView.setLoadComplete(true)以后,就會隱藏footerview;假設過段時間又有新的數據了。能夠調用xRefreshView.setLoadComplete(false)。這樣就又能夠正常載入很多其它了。

7.其它一些屬性的設置

/** * 設置headerview回滾的時間,默認400毫秒 * * @param during */
    public void setScrollDuring(int during) {
        SCROLL_DURATION = during;
    }

    /** * 設置阻尼系數,建議使用默認的 * * @param ratio * 默認 1.8 */
    public void setDampingRatio(float ratio) {
        OFFSET_RADIO = ratio;
    }

    /** * 設置當下拉刷新完畢以后。headerview和footerview被固定的時間 * 注:考慮到ui效果,僅僅有時間大於1s的時候,footerview被固定的效果才會生效 * * @param pinnedTime */
    public void setPinnedTime(int pinnedTime) {
        mPinnedTime = pinnedTime;
        mContentView.setPinnedTime(pinnedTime);
    }

8.XRefreshView提供的監聽


    public interface XRefreshViewListener {
        /** * 下拉刷新的回調 */
        public void onRefresh();
        /** * 上拉載入很多其它的回調 */
        public void onLoadMore();


        /** * 用戶手指釋放的監聽回調 * * @param direction * >0: 下拉釋放。<0:上拉釋放 注:臨時沒有使用這種方法 */
        public void onRelease(float direction);

        /** * 獲取headerview顯示的高度與headerview高度的比例 * * @param offset * 移動距離和headerview高度的比例。范圍是0~1,0:headerview全然沒顯示 * 1:headerview全然顯示 * @param offsetY * headerview移動的距離 */
        public void onHeaderMove(double offset, int offsetY);
    }

9.自己定義header和footer

9.1.自己定義header

實現IHeaderCallBack接口。並繼承View就能夠自己定義headerview了

/** * 提供自己定義headerview的接口 * * @author huxq17@163.com * */
public interface IHeaderCallBack {
    /** * 正常狀態 */
    public void onStateNormal();

    /** * 准備刷新 */
    public void onStateReady();

    /** * 正在刷新 */
    public void onStateRefreshing();

    /** * 刷新結束 */
    public void onStateEnd();

    /** * 獲取headerview顯示的高度與headerview高度的比例 * * @param offset * 移動距離和headerview高度的比例,范圍是0~1,0:headerview全然沒顯示 1:headerview全然顯示 * @param offsetY * headerview移動的距離 */
    public void onHeaderMove(double offset, int offsetY);

    /** * 設置顯示上一次刷新的時間 * * @param lastRefreshTime * 上一次刷新的時間 */
    public void setRefreshTime(long lastRefreshTime);

    /** * 隱藏footerview */
    public void hide();

    /** * 顯示footerview */
    public void show();

    /** * 獲得headerview的高度,假設不想headerview所有被隱藏,就能夠僅僅返回一部分的高度 * * @return */
    public int getHeaderHeight();
}

這里須要介紹下幾種headerview的狀態

Created with Raphaël 2.1.0 normal normal ready ready refreshing refreshing finish finish header移動的距離大於header的高度 header移動的距離小於header的高度 松手進入refreshing狀態 刷新完畢進入finish狀態,此過程header被固定着 此時header開始回彈,至全然隱藏時,狀態變成normal

XRefreshView提供了不同狀態的回調,方便開發人員依據狀態來改變headerview的顯示,同一時候為了提供更加強大的支持。XRefreshView提供了onHeaderMove(double offset, int offsetY)回調來返回當前headerview移動的信息。這樣能夠更加自由的定制headerview。在繼承了View並實現了IHeaderCallBack接口以后,須要調用以下這種方法來設置自己定義headerview

refreshView.setCustomHeaderView(new CustomHeader(this));

9.2.自己定義footer

自己定義footer和自己定義header相似,都相同要實現接口,自己定義footer要實現 IFooterCallBack接口

public interface IFooterCallBack {
    /** * 當不是到達底部自己主動載入很多其它的時候,須要自己寫點擊事件 * @param xRefreshViewListener */
    public void callWhenNotAutoLoadMore(XRefreshViewListener xRefreshViewListener);
    /** * 正常狀態,比如須要點擊footerview才干載入很多其它。主要是到達底部不自己主動載入很多其它時會被調用 */
    public void onStateReady();
    /** * 正在刷新 */
    public void onStateRefreshing();
    /** * 刷新結束 */
    public void onStateFinish();
    /** * 已無很多其它數據 */
    public void onStateComplete();
    /** * 隱藏footerview */
    public void hide();
    /** * 顯示footerview */
    public void show();
    /** * 獲得footerview的高度 * @return */
    public int getFooterHeight();
}

footerview的狀態流程分成兩種
1.當到達底部自己主動載入很多其它:
1.1.還有很多其它數據
refreshing–>finish–>refreshing
1.2.已無很多其它數據
refreshing–>finish–>complete

2.當到達底部不自己主動載入很多其它:
2.1.還有很多其它數據
ready–>refreshing–>finish–>refreshing
2.2.已無很多其它數據
ready–>refreshing–>finish–>complete

當中,當不是到達底部自己主動載入很多其它的時候,須要自己寫點擊事件,就像這樣:

@Override
    public void callWhenNotAutoLoadMore(final XRefreshViewListener listener) {
        mClickView.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                if(listener!=null){
                    listener.onLoadMore();
                    onStateRefreshing();
                }
            }
        });
    }

給footer設置點擊事件。在點擊事件中直接回調onLoadMore。而且進入刷新狀態。

還有就是footer的show和hide方法不能向header那樣:

header
/** * hide footer when disable pull load more */
    public void hide() {
        setVisibility(View.GONE);
    }

    public void show() {
        setVisibility(View.VISIBLE);
    }

直接gone會給列表底部留下空白。所以應該這樣

public void hide() {
        LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) mContentView
                .getLayoutParams();
        lp.height = 0;
        mContentView.setLayoutParams(lp);
    }

    public void show() {
        LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) mContentView
                .getLayoutParams();
        lp.height = LayoutParams.WRAP_CONTENT;
        mContentView.setLayoutParams(lp);
    }

最后也須要通過以下這種方法來設置自己定義footerview

refreshView.setCustomFooterView(new CustomFooterView(this));

10.Recylerview的Adapter

Recylerview的adapter必須繼承自UltimateViewAdapter。具體使用方法能夠參照demo中的SimpleAdapter,此外,給Recylerview設置自己定義footerview和設置自己定義headerview是不一樣的。設置自己定義headerview是通過XRefreshView來設置的,可是設置自己定義footerview確是通過UltimateViewAdapter來設置的。具體例如以下:

UltimateViewAdapter
/** * Using a custom LoadMoreView * * @param customview * the inflated view */
    public void setCustomLoadMoreView(View footerView) {
        if (footerView instanceof IFooterCallBack) {
            customLoadMoreView = footerView;
        } else {
            throw new RuntimeException(
                    "footerView must be implementes IFooterCallBack!");
        }
    }



......

    adapter.setCustomLoadMoreView(footerView);

注:眼下上拉載入很多其它僅僅支持Linearlayoutmanager。我還在找解決的方法。

最后

XRefreshView托管於github。點此前往下載,歡迎start or fork。

參考的項目

在開發過程中有參考一些非常不錯的開源項目。各自是

  1. UltimateRecyclerView
  2. android-Ultra-Pull-To-Refresh


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM