孟老板 BaseAdapter封装 (二) Healer,footer

 

 

1.添加 Header Footer

前言:

上一遍已经对 Adapter做了简单的封装, 这一遍我们为Adaper 添加头尾View;  
头尾view时比较常见的业务场景. 相信大家也都用过, 来比较一下差别吧.

1.1 分析:

  1. 既然要添加头尾,  就必须要有 头尾对应的 View, 这个View一般从 Activity或Fragment中维护管理;

  2. 头尾View, 应属于不用的 ItemType 类型;

  3. 注意 postion的正确性; header也是一个Item 会让 列表数据的 position + 1

 

直接上源码:

public abstract class HeadAdapter<T> extends BaseAdapter<T> {
    /**
     * 头布局
     */
    private View mHeadView;
    /**
     * 尾布局
     */
    private View mFootView;

    /**
     * 头尾布局的 itemType
     */
    protected static final int ITEM_HEAD = 0xab;
    protected static final int ITEM_FOOT = 0xac;

    public HeadAdapter(@NotNull Context mContext, @Nullable List<T> mData, @Nullable AdapterListener listener) {
        super(mContext, mData, listener);
    }

    public View getmHeadView() {
        return mHeadView;
    }

    public void setmHeadView(@NotNull View mHeadView) {
        //设置 头尾 View时, 刷新布局
        notifyItemInserted(0);
        this.mHeadView = mHeadView;
    }

    public View getmFootView() {
        return mFootView;
    }

    public void setmFootView(@NotNull View mFootView) {
        notifyItemInserted(super.getItemCount() + getHeadCount());
        this.mFootView = mFootView;
    }

    /**
     * 获取条目类型. 校验是否 头尾 View
     * @param position
     * @return
     */
    @Override
    public int getItemViewType(int position) {
        if(checkHead(position)) return ITEM_HEAD;
        if(checkFoot(position)) return ITEM_HEAD;
        return getMyType(position);
    }

    @NotNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NotNull ViewGroup parent, int viewType) {
        // 头尾 View 时 返回 EndHolder
        if(viewType == ITEM_HEAD && hasHead()) return new EndHolder(mHeadView);
        if(viewType == ITEM_FOOT && hasFoot()) return new EndHolder(mFootView);
        return createMyHolder(parent, viewType);
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder recHolder, int position) {
        //头尾 View 不需要额外渲染数据;  真是条目的 position 需要减去 header 长度;
        if (checkHead(position)) return;
        if (checkFoot(position)) return;
        super.onBindViewHolder(recHolder, position - getHeadCount());
    }

    /**
     * 条目数量;  头尾数量 + 集合数量
     * @return
     */
    @Override
    public int getItemCount() {
        return super.getItemCount() + getHeadCount() + getFootCount();
    }

    /**
    * 获取头部view条目数量
     * @return 返回头部view条目数量
     */
    public int getHeadCount(){
        if (mHeadView == null){
            return 0;
        }
        return 1;
    }

    /**
     * 获取foot view条目数量
     * @return 返回foot view条目数量
     */
    public int getFootCount(){
        if (mFootView == null){
            return 0;
        }
        return 1;
    }

    /**
     * 是否包含 HeadView
     */
    public boolean hasHead(){
        return mHeadView != null;
    }

    /**
     * 是否包含 FootView
     */
    public boolean hasFoot(){
        return mHeadView != null;
    }

    /**
     * 判断条目是否为 HeadView
     * @param position 条目索引
     * @return
     */
    private boolean checkHead(int position) {
        return position == 0 && mHeadView != null;
    }

    /**
     * 判断条目是否为 FootView
     * @param position 条目索引
     * @return
     */
    private boolean checkFoot(int position) {
        return position >= super.getItemCount() + getHeadCount();
    }

    private static class EndHolder extends RecyclerView.ViewHolder{
        public EndHolder(@NonNull View itemView) {
            super(itemView);
        }
    }

回到顶部

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