通常来说加载一个列表的数据会有以下几种状态:加载中、加载失败,数据列表为空,正常的数据列表以及加载更多。
在以前使用ListView的时候可以通过setEmptyView来设置空布局,但是RecyclerView没有这样自带的方法。
所以我通过自己实现一个RecyclerView.Adapter来统一处理这几种状态,然后项目里面给RecyclerView设置
Adapter的时候都继承该StatusAdapter。
效果图:
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方法。
举个栗子:
- 继承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();
}
}
- 使用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();
网友评论