打造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.0normalnormalreadyreadyrefreshingrefreshingfinishfinishheader移动的距离大于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
posted on 2016-03-23 21:47  gcczhongduan  阅读(2349)  评论(0编辑  收藏  举报