孟老板 BaseAdapter封装 (三) 空数据占位图

 

 

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);
        }
    }
}

 

posted @ 2021-06-07 16:57  孟老板  阅读(438)  评论(0编辑  收藏  举报