孟老板 BaseAdapter封装 (三) 空数据占位图
- BaseAdapter封装(一) 简单封装
- BaseAdapter封装(二) Header,footer
- BaseAdapter封装(三) 空数据占位图
- BaseAdapter封装(四) PageHelper
- ListAdapter系列
- Paging3 系列
1.空数据占位
前言:
当列表中无数据时, 显示暂无数据的占位View;
现有实现方式:
1. 在每一个需要空占位的 RecycleView 页面中,添加占位View (可以用 ViewStub); 然后当无数据时, 控制 RecycleView 和 NothingView 的显示隐藏
2. 重写 RecycleView (想了解的请自行百度)
3. 重写Adapter
显然 第一种方式 费时费力; 第二种第三种随意;
1.1 分析:
1.集合没有数据时, 算作只有 1个条目的 Adapter
2.空数据时, 返回 空布局的 ViewHolder, 且不需要渲染数据
直接上代码
public abstract class BaseNothingAdapter<T> extends BaseAdapter<T> { protected static final int ITEM_NOTHING = 0xad; //空类型 Item /** * 空布局 res */ @LayoutRes private int mNothingRes; public BaseNothingAdapter(@NotNull Context mContext, @Nullable List<T> mData, @Nullable AdapterListener listener) { this(mContext, mData, listener, R.layout.item_nothing); } public BaseNothingAdapter(@NotNull Context mContext, @Nullable List<T> mData, @Nullable AdapterListener listener, @LayoutRes int nRes) { super(mContext, mData, listener); this.mNothingRes = nRes; } /** * 当集合数据为空时, 返回 1 * @return */ @Override public int getItemCount() { if(mData == null || mData.isEmpty()) return 1; return mData.size(); } /** * 当集合数据为空时, 返回 空布局类型 * @param position * @return */ @Override public int getItemViewType(int position) { if(mData == null || mData.isEmpty()){ return ITEM_NOTHING; }else { return getMyType(position); } } @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { //空布局类型时, 返回 NothingHolder if(viewType == ITEM_NOTHING) return new NothingHolder(layoutInflater.inflate(mNothingRes, parent, false)); else return createMyHolder(parent,viewType); } @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder recHolder, final int position) { // 空布局类型时, 不做操作; if(getItemViewType(position) == ITEM_NOTHING){ return; } onBindMyData(recHolder,position); } protected static class NothingHolder extends RecyclerView.ViewHolder { NothingHolder(@NonNull View itemView) { super(itemView); } } }