• 打造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
  • 相关阅读:
    Balsamiq Mockups完全手册
    LPTSTR、 LPCSTR、LPCTSTR、LPSTR的来源及意义(转)
    Socket编程
    在窗口中绘图(转)
    写博客
    _beginthread还是CreateThread (转)
    CString 与其他类型的转换
    TCP/IP 详述 (转大部分)
    解决svgview控件ax_XXX_Control.SetSRC中出现内存不能为write 遥远的青苹果
    new 与malloc问题 遥远的青苹果
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5313272.html
Copyright © 2020-2023  润新知