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

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

效果图:

支持功能

  • 很方便的添加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<RecyclerView.ViewHolder> {
        private final int VIEW_TYPE_TEXT = 1;
        private final int VIEW_TYPE_IMAGE = 2;

        private List<String> mDataList;

        public MyAdapter(List<String> 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();
复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值