孟老板 BaseAdapter封装 (二) Healer,footer
- BaseAdapter封装(一) 简单封装
- BaseAdapter封装(二) Header,footer
- BaseAdapter封装(三) 空数据占位图
- BaseAdapter封装(四) PageHelper
- ListAdapter系列
- Paging3 系列
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); } }