支持addHeaderView、 addFooterView、以及分頁加載數據的RecyclerView

jopen 9年前發布 | 30K 次閱讀 Android開發 移動開發 RecyclerView

介紹

HeaderAndFooterRecyclerView是支持addHeaderView、 addFooterView、分頁加載數據的RecyclerView。

它可以對 RecyclerView 控件進行拓展,給RecyclerView增加HeaderView、FooterView,并且不需要對你的Adapter做任何修改。

同時,通過修改FooterView State,可以動態為FooterView賦予不同狀態(加載中、加載失敗、滑到最底等),可以實現RecyclerView分頁加載數據時的loading/theEnd/NetWorkError效果。

使用

  • 添加HeaderView、FooterView
        mHeaderAndFooterRecyclerViewAdapter = new HeaderAndFooterRecyclerViewAdapter(mDataAdapter);
        mRecyclerView.setAdapter(mHeaderAndFooterRecyclerViewAdapter);

        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));

        //add a HeaderView
        RecyclerViewUtils.setHeaderView(mRecyclerView, new SampleHeader(this));

        //add a FooterView
        RecyclerViewUtils.setFooterView(mRecyclerView, new SampleFooter(this));

  • LinearLayout/GridLayout/StaggeredGridLayout布局的RecyclerView分頁加載
mRecyclerView.addOnScrollListener(mOnScrollListener);
private EndlessRecyclerOnScrollListener mOnScrollListener = new EndlessRecyclerOnScrollListener() {

        @Override
        public void onLoadNextPage(View view) {
            super.onLoadNextPage(view);

            LoadingFooter.State state = RecyclerViewStateUtils.getFooterViewState(mRecyclerView);
            if(state == LoadingFooter.State.Loading) {
                Log.d("@Cundong", "the state is Loading, just wait..");
                return;
            }

            mCurrentCounter = mDataList.size();

            if (mCurrentCounter < TOTAL_COUNTER) {
                // loading more
                RecyclerViewStateUtils.setFooterViewState(EndlessLinearLayoutActivity.this, mRecyclerView, REQUEST_COUNT, LoadingFooter.State.Loading, null);
                requestData();
            } else {
                //the end
                RecyclerViewStateUtils.setFooterViewState(EndlessLinearLayoutActivity.this, mRecyclerView, REQUEST_COUNT, LoadingFooter.State.TheEnd, null);
            }
        }
    };

注意事項

如果已經使用RecyclerViewUtils.setHeaderView(mRecyclerView, view);為RecyclerView添加了HeaderView,那么再調用ViewHolder類的getAdapterPosition()、getLayoutPosition()時返回的值就會因為增加了Header而受影響(返回的position等于真實的position+headerCounter)。

因此,這種情況下請使用RecyclerViewUtils.getAdapterPosition(mRecyclerView, ViewHolder.this)、RecyclerViewUtils.getLayoutPosition(mRecyclerView, ViewHolder.this)兩個方法來替代。

Demo

  • 添加HeaderView、FooterView

支持addHeaderView、 addFooterView、以及分頁加載數據的RecyclerView

  • 支持分頁加載的LinearLayout布局RecyclerView

支持addHeaderView、 addFooterView、以及分頁加載數據的RecyclerView

  • 支持分頁加載的GridLayout布局RecyclerView

支持addHeaderView、 addFooterView、以及分頁加載數據的RecyclerView

  • 支持分頁加載的StaggeredGridLayout布局RecyclerView

支持addHeaderView、 addFooterView、以及分頁加載數據的RecyclerView

  • 分頁加載失敗時的GridLayout布局RecyclerView

支持addHeaderView、 addFooterView、以及分頁加載數據的RecyclerView

項目主頁:http://www.baiduhome.net/lib/view/home/1447126569319

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!