Android三方控件-----XRecyclerView改进

一、介绍

一个实现了下拉刷新,滚动到底部加载更多以及添加header功能的的RecyclerView。
使用方式和RecyclerView完全一致,不需要额外的layout,不需要写特殊的adater。
加载效果内置了AVLoadingIndicatorView上的所有效果,可以根据需要指定。
项目地址:https://github.com/jianghejie/XRecyclerView

基本上主流的下拉效果都有了

二、改进

1、支持两种头部布局,即单纯的刷新和上下翻页的布局
2、在XRecycleView里实现了翻页的变量,外部不只需要很少的代码就能控制请求的开始位置
3、对XRecycleView的设置进行封装,也可以单个调用

三、代码

1、支持两种头部布局,即单纯的下拉刷新和上下翻页的布局和封装

    /**
     * @param context
     * @param isLittleHeader true表示上下翻页,false下拉刷新
     */
    public tztXRecyclerView(Context context, boolean isLittleHeader) {
        super(context);
        mIsLittleHeader = isLittleHeader;
        init();
        //公共的属性设置
        setCommParam();
    }
    /**
     * 设置tztXRecyclerView的公共默认参数,也可以单独设置
     * @return
     */
    private void setCommParam(){
        //设置tztRecyclerView不能下拉刷新
        //mDetailListView.setPullRefreshEnabled(false);
        setRefreshProgressStyle(ProgressStyle.BallSpinFadeLoader);
        //设置tztXRecyclerView上拉加载更多
        setLoadingMoreProgressStyle(ProgressStyle.BallSpinFadeLoader);
        //设置tztXRecyclerView下拉刷新即上一页的效果图片
        setArrowImageView(R.drawable.tzt_xrecycleview_iconfont_downgrey);
        //设置tztXRecyclerView加载到最后一页再上拉的提示信息
        //getDefaultFootView().setNoMoreHint("加载完毕");
        //设置tztXRecyclerView下拉刷新时间提示
        getDefaultRefreshHeaderView().setRefreshTimeVisible(false);

        setLimitNumberToCallLoadMore(2);

        //是否允许显示加载更多
        //setLoadingMoreEnabled(false);
    }

2、在XRecycleView里实现了翻页的变量,外部不只需要很少的代码就能控制请求的开始位置

    //数据请求开始位置
    public int mStartPos = 0;
    //一共返回多少条数据
    public int mMaxCount;
    //一共有多少页数据
    public int mPagesCount;
    //当前是在第几页
    public int mPagesNow = 1;

    /**
     * 计算页数信息
     * @param refreshType 1上拉刷新2下来加载更多
     * @param maxCount 总共记录数 maxCount=-1表示请求失败
     */
    public void completeLoad(int refreshType, int maxCount){
        if (refreshType == 2) {
            loadMoreComplete();
            if(maxCount >= 0) {
                scrollToPosition(0);
            }
        } else if (refreshType == 1) {
            refreshComplete();
        }
        //获取一共返回多少条数据
        if(maxCount >= 0) {
            mMaxCount = maxCount;
            if (getReqMaxCount() > 0 && mMaxCount > 0) {
                if (getReqMaxCount() % mMaxCount == 0) {
                    mPagesCount = mMaxCount / getReqMaxCount();
                } else {
                    mPagesCount = mMaxCount / getReqMaxCount() + 1;
                }
            }
        }
    }
    /**
     * 每页条数,必须实现
     * @return
     */
    public int getReqMaxCount(){
        return 100;
    }


    @Override
    public void onScrollStateChanged(int state) {
        super.onScrollStateChanged(state);
        if (state == RecyclerView.SCROLL_STATE_IDLE && mLoadingListener != null && !isLoadingData && loadingMoreEnabled) {

            ......


            {
                isLoadingData = true;
                if (mFootView instanceof LoadingMoreFooter) {
                    ((LoadingMoreFooter) mFootView).setState(LoadingMoreFooter.STATE_LOADING);
                } else {
                    if(footerViewCallBack != null){
                        footerViewCallBack.onLoadingMore(mFootView);
                    }
                }
                //翻页代码
                if (mPagesNow < mPagesCount) {
                    mStartPos = mStartPos + getReqMaxCount();

                    //请求下一页数据
                    if(mLoadingListener != null) {
                        mLoadingListener.onLoadMore(mStartPos, 2);
                    }

                    mPagesNow++;
                    return;
                } else {
                    setNoMore(true);
                    loadMoreComplete();
                }
            }
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        ......
            default:
                mLastY = -1; // reset
                if (isOnTop() && pullRefreshEnabled && appbarState == AppBarStateChangeListener.State.EXPANDED) {
                    if (mRefreshHeader != null && mRefreshHeader.releaseAction()) {
                        //翻页代码
                        mStartPos = mStartPos - getReqMaxCount();
                        if(mStartPos < 0){
                            mStartPos = 0;
                        }
                        //请求上一页数据
                        if (mLoadingListener != null) {
                            mLoadingListener.onRefresh(mStartPos, 1);
                        }
                        //
                        if(mPagesNow > 0) {
                            mPagesNow--;
                        }
                    }
                }
                break;
        }
        return super.onTouchEvent(ev);
    }

三、具体调用

    public void onInit() {
        //isLittleHeader true表示上下翻页,false下拉刷新、
        mDetailListView = new tztXRecyclerView(Rc.getApplication(), true)
        //上拉加载更多和下拉刷新的监听事件
        mDetailListView.setLoadingListener(new tztXRecyclerView.LoadingListener() {
            @Override
            public void onRefresh(int startpos, final int refreshType) {
                //请求上一页数据
                doCreateReq(false, startpos, refreshType);
            }

            @Override
            public void onLoadMore(int startpos, final int refreshType) {
                //请求下一页数据
                doCreateReq(false, startpos, refreshType);
            }
        });
    }

    public void doCreateReq(final boolean isBg, int startpos, final int refreshType) {
        tztRequest_Detail request_Detail = new tztRequest_Detail(null) {
            @Override
            public void doRefreshUI(final tztReqBase j, final tztNewDetailBean bean) {
                post(new Runnable() {
                    @Override
                    public void run() {
                        //设置翻页的总条数、关闭刷新或者加载更多的动画
                        mDetailListView.completeLoad(refreshType, bean.getMaxCount());
                        tztTrendLandscapeDetailView.this.doRefreshUI(j, bean);
                    }
                });
            }
        };
        request_Detail.mStockCode = mPankouCallBack.getStockStruct().getStockCode();
        request_Detail.mNewMarketNo = mPankouCallBack.getStockStruct().getStockType() + "";
        request_Detail.mStartPos = startpos;
        request_Detail.mMaxCount = mReqMaxCount;
        request_Detail.sendRequest(isBg);
    }

猜你喜欢

转载自blog.csdn.net/pangjl1982/article/details/86372984