给RecyclerView添加showLoadng、showEmpty、showError和LoadMore功能

通常来说加载一个列表的数据会有以下几种状态:加载中、加载失败,数据列表为空,正常的数据列表以及加载更多。
在以前使用ListView的时候可以通过setEmptyView来设置空布局,但是RecyclerView没有这样自带的方法。
所以我通过自己实现一个RecyclerView.Adapter来统一处理这几种状态,然后项目里面给RecyclerView设置
Adapter的时候都继承该StatusAdapter。

效果图:

给RecyclerView添加showLoadng、showEmpty、showError和LoadMore功能_第1张图片
demo.gif

支持功能

  • 很方便的添加LoadngView、EmptyView、ErrorView
  • 滑动到底部自动加载更多
  • 数据列表为空时自动显示EmptyView
  • 支持给EmptyView、ErrorView设置点击事件监听
  • 状态View懒加载
  • 自定义UI,自定义Empty、Error状态的bindView操作

Github地址 (https://github.com/wangyiwy/StatusAdapter)

使用方法:

  • 继承StatusAdapter
  • 实现onCreateDataViewHolder onBindDataViewHolder getDataItemCount
  • 如果需要实现多种布局,使用getDataItemType代替以前的getItemType
  • 改变状态:mAdapter.showLoading() mAdapter.showEmpty() mAdapter.showError() mAdapter.showNormal(),如果当前是STATUS_NORMAL状态当数据被清空的时候会自动显示EmptyView
  • 添加加载更多监听 并在加载结束调用onLoadingFinish方法。
    举个栗子:
  1. 继承StatusAdapter
    private class MyAdapter extends StatusAdapter {
        private final int VIEW_TYPE_TEXT = 1;
        private final int VIEW_TYPE_IMAGE = 2;

        private List mDataList;

        public MyAdapter(List dataList) {
            this.mDataList = dataList;
        }

        @Override
        public RecyclerView.ViewHolder onCreateDataViewHolder(ViewGroup parent, int viewType) {
            if (viewType == VIEW_TYPE_TEXT) {
                View itemView = LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.item_list_text, parent, false);
                return new TextDataHolder(itemView);
            } else {
                View itemView = LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.item_list_image, parent, false);
                return new ImageDataHolder(itemView);
            }
        }

        @Override
        public void onBindDataViewHolder(RecyclerView.ViewHolder holder, int position) {
            if (holder instanceof TextDataHolder) {
                TextDataHolder textDataHolder = (TextDataHolder) holder;
                textDataHolder.textView.setText("Hello World! " + position);
            } else if (holder instanceof ImageDataHolder) {
                //todo bindImageDataViewHolder
            }
        }

        @Override
        public int getDataItemCount() {
            return mDataList.size();
        }

        @Override
        public int getDataItemType(int position) {
            if (position % 2 == 0) {
                return VIEW_TYPE_TEXT;
            } else {
                return VIEW_TYPE_IMAGE;
            }
        }

        @Override
        protected void bindEmptyViewHolder(RecyclerView.ViewHolder holder) {
            super.bindEmptyViewHolder(holder);
            //可以在这里实现自定义操作
        }

        @Override
        protected void bindErrorViewHolder(RecyclerView.ViewHolder holder) {
            super.bindErrorViewHolder(holder);
            //可以在这里实现自定义操作
        }

        @Override
        protected int getLoadingLayout() {
            //重写此方法或者createLoadingViewHolder方法修改LoadingView
            return super.getLoadingLayout();
        }

        @Override
        protected int getEmptyLayout() {
            //重写此方法或者createEmptyViewHolder方法修改EmptyView
            return super.getEmptyLayout();
        }

        @Override
        protected int getErrorLayout() {
            //重写此方法或者createErrorViewHolder方法修改ErrorView
            return super.getErrorLayout();
        }

        @Override
        protected int getLoadMoreLayout() {
            //重写此方法或者createLoadMoreHolder方法修改ErrorView
            return super.getLoadMoreLayout();
        }
    }
  1. 使用Adapter
        //添加点击事件
        mAdapter.setOnStatusViewClickListener(new OnStatusViewClickListener() {
            @Override
            public void onEmptyViewClick(View view) {
                Toast.makeText(view.getContext(), "OnEmptyViewClick",
                        Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onErrorViewClick(View view) {
                Toast.makeText(view.getContext(), "OnErrorViewClick",
                        Toast.LENGTH_SHORT).show();
            }
        });
        //加载更多监听
        mAdapter.setOnLoadMoreListener(new OnLoadMoreListener() {
            @Override
            public void onLoadMore() {
                //... 加载下一页数据
            }
        });
       //加载完成
       mAdapter.onLoadingFinish();

你可能感兴趣的:(给RecyclerView添加showLoadng、showEmpty、showError和LoadMore功能)