关于RecyclerView设置空白布局,网上已经有不少大神有总结了,如:关于RecyclerView如何设置空布局(setEmptyView)的几种方式总结了设置空白布局的几种方式。作者本次是在通过修改Adapter的这个方式基础上讲的。
正如关于RecyclerView如何设置空布局(setEmptyView)的几种方式文章中介绍的设置空白布局的方式,只适用于列表布局,如果是网格布局则不适用了。
网格布局需要在列表布局设置空白布局的基础上设置setSpanSizeLookup()这个方法,对条目占据的分数进行处理。
先看一下,列表布局设置空白布局的步骤。
列表布局设置空白布局的设置均在adapter中。
1、重写getItemViewType方法
根据是否有数据返回不同的viewType。
private static final int VIEW_TYPE_EMPTY = -1;
private static final int VIEW_TYPE_ITEM = 0;
......
@Override
public int getItemViewType(int position) {
return (mData == null || mData.isEmpty()) ? VIEW_TYPE_EMPTY : VIEW_TYPE_ITEM;
}
2、在getItemCount方法中无数据时返回1。
@Override
public int getItemCount() {
return (mData == null || mData.isEmpty()) ? 1 : mData.size();
}
没有数据时,返回1个条目,用于展示空白布局。
3、在onCreateViewHolder方法中根据viewType返回空白布局的ViewHolder及有数据的ViewHolder。
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
if(viewType == VIEW_TYPE_EMPTY) {
return getEmptyViewHolder(parent);
}
return getViewHolder(parent, viewType);
}
4、如果需要对空白布局进行操作,则在onBindViewHolder方法中进行逻辑处理。
例如
@Override
public void onBindViewHolder(@NonNull BaseRecyclerViewAdapter.ViewHolder holder, final int position) {
......
int viewType = getItemViewType(position);
//增加viewType类型的判断
if(viewType == VIEW_TYPE_EMPTY) {
holder.setData(null, position);
return;
}
if(mData == null || mData.isEmpty()) {
return;
}
......
}
5、在getEmptyViewHolder方法中返回空白局部的ViewHolder。
经过以上设置后,列表布局数据为空时,即可展示空白布局。但是如果是网格布局,空白布局只会占据页面宽度的1/n(n为设置的spanCount),没有达到预期效果。
这时候需要设置setSpanSizeLookup方法,对条目占据的分数进行处理。
6、GridLayoutManager设置setSpanSizeLookup处理条目占据的分数问题。
//设置layoutManager
GridLayoutManager manager = new GridLayoutManager(mContext, SPAN_COUNT, RecyclerView.VERTICAL, false);
rv_list.setLayoutManager(manager);
//设置空白数据时,空白布局占据的spanCount
manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
int viewType = rv_list.getAdapter().getItemViewType(position);
if(viewType == -1) {
return SPAN_COUNT;
}
return 1;
}
});
这样设置后,就可以达到空白布局长度和宽度match_parent的效果。
附:
1、参考demo:Github Demo
2、参考文章:关于RecyclerView如何设置空布局(setEmptyView)的几种方式