使用RecyclerView实现动态添加头布局,脚布局

本文介绍如何通过重写RecyclerView.Adapter,实现RecyclerView中动态添加头部和底部布局的功能。主要步骤包括创建adapter,继承并实现相关方法,创建viewholder,绑定自定义adapter,以及设置和添加脚布局。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过重写RecyclerView.Adapter来实现添加头脚布局的功能

-----具体使用

1 创建adapter继承DBaseRecyclerViewAdapter,实现onCreateViewHolder1()方法,绑定布局

2 创建viewholder继承DBaseRecyclerViewHolder,实现setData()方法,设置页面数据

3 绑定自定义的adapter与DRecyclerViewAdapter

4 添加脚布局

5 设置adapter到recyclerView

---伪代码

        MyAdapter myAdapter = new MyAdapter(this, arrayList);
        DRecyclerViewAdapter recyclerViewAdapter = new DRecyclerViewAdapter(myAdapter);
        GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 3);
        gridLayoutManager.setSpanSizeLookup(new DSpanSizeLookup(recyclerViewAdapter, gridLayoutManager.getSpanCount() - 2));
        recyclerView.setLayoutManager(gridLayoutManager);
        ((DefaultItemAnimator) recyclerView.getItemAnimator()).setSupportsChangeAnimations(false);
        recyclerViewAdapter.addFootView(view1);
        recyclerView.setAdapter(recyclerViewAdapter);

---继承自RecyclerView.Adapter的类

public abstract class DBaseRecyclerViewAdapter<T> extends RecyclerView.Adapter<DBaseRecyclerViewHolder> {

    private List<T> mDatas;
    private Context mContext;


    /**
     * 默认点击监听事件
     */
    public interface OnClickItemListener {
        void onClick(int poisiton);
    }

    OnClickItemListener onClickItemListsner;

    public void setOnClickItemListsner(OnClickItemListener onClickItemListsner) {
        this.onClickItemListsner = onClickItemListsner;
    }

    public OnClickItemListener getOnClickItemListsner() {
        return onClickItemListsner;
    }

    private DRecyclerViewAdapter mDRecyclerViewAdapter;

    public DRecyclerViewAdapter getmDRecyclerViewAdapter() {
        return mDRecyclerViewAdapter;
    }

    public void setDRecyclerViewAdapter(DRecyclerViewAdapter mDRecyclerViewAdapter) {
        this.mDRecyclerViewAdapter = mDRecyclerViewAdapter;
    }


    private DRecyclerViewAdapter dRecyclerViewAdapter;


    public DBaseRecyclerViewAdapter(List<T> mDatas, Context mContext) {
        this.mDatas = mDatas;
        this.mContext = mContext;
    }

    @Override
    public DBaseRecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return onCreateViewHolder1(parent, viewType);
    }

    protected abstract DBaseRecyclerViewHolder onCreateViewHolder1(ViewGroup parent, int viewType);

    @Override
    public void onBindViewHolder(DBaseRecyclerViewHolder holder, int position) {
        holder.setData(mDatas.get(position), position);
    }

    @Override
    public int getItemCount() {
        return mDatas.size();
    }


    public boolean isHeader(int position) {
        return getHeaderViewsCount() > 0 && position < getHeaderViewsCount();
    }


    public boolean isFooter(int position) {
        int lastPosition = getItemCount() - 1;
        return getFooterViewsCount() > 0 && position > lastPosition - getFooterViewsCount() && position <= lastPosition;
    }

    private int getFooterViewsCount() {
        return mDRecyclerViewAdapter.getFootSize();
    }

    public int getHeaderViewsCount() {
        return mDRecyclerViewAdapter.getHeadSize();
    }
}
----继承自RecyclerView.ViewHolder的viewHolder

public abstract class DBaseRecyclerViewHolder<T> extends RecyclerView.ViewHolder {

    private DBaseRecyclerViewAdapter dBaseRecyclerViewAdapter;
    private DRecyclerViewAdapter mDRecyclerViewAdapter;

    DBaseRecyclerViewAdapter.OnClickItemListener onClickItemListsner;

    public DBaseRecyclerViewAdapter.OnClickItemListener getOnClickItemListsner() {
        return onClickItemListsner;
    }


    public DBaseRecyclerViewHolder(View itemView, DBaseRecyclerViewAdapter dBaseRecyclerViewAdapter) {
        super(itemView);

        this.dBaseRecyclerViewAdapter = dBaseRecyclerViewAdapter;
        mDRecyclerViewAdapter = dBaseRecyclerViewAdapter.getmDRecyclerViewAdapter();
        onClickItemListsner = dBaseRecyclerViewAdapter.getOnClickItemListsner();
    }

    public DBaseRecyclerViewHolder(ViewGroup parent, @LayoutRes int res, DBaseRecyclerViewAdapter dBaseRecyclerViewAdapter) {

        super(LayoutInflater.from(parent.getContext()).inflate(res, parent, false));

        mDRecyclerViewAdapter = dBaseRecyclerViewAdapter.getmDRecyclerViewAdapter();
        this.dBaseRecyclerViewAdapter = dBaseRecyclerViewAdapter;
        onClickItemListsner = dBaseRecyclerViewAdapter.getOnClickItemListsner();

    }

    protected <T extends View> T $(@IdRes int id) {
        return (T) itemView.findViewById(id);
    }

    public abstract void setData(T data, int position);

//
//    /**
//     * 处理有头部和尾部的情况 返回点击的位置
//     * @return
//     */
//    /**
//     * 获取点击的item的position
//     *
//     * @return
//     */
//    public int getAdapterItemPosition()
//    {
//        int oldPosition = getAdapterPosition();
//
//        if (dBaseRecyclerViewAdapter == null)
//        {
//            return oldPosition;
//        }
//
//        if (dBaseRecyclerViewAdapter.isHeader(oldPosition) || dBaseRecyclerViewAdapter.isFooter(oldPosition))
//        {
//            return - 1;
//        }
//        else
//        {
//            return oldPosition - dBaseRecyclerViewAdapter.getHeaderViewsCount();
//        }
//    }

}

-----DRecyclerViewAdapter类的方法

public class DRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    public static final String Tag = DRecyclerViewAdapter.class.getName();
    private RecyclerView.Adapter mInnerAdapter;

    public DRecyclerViewAdapter(DBaseRecyclerViewAdapter adapter) {
        setAdapter(adapter);
    }

    public void setAdapter(DBaseRecyclerViewAdapter myAdapter) {
        if (myAdapter != null) {
            if (! (myAdapter instanceof RecyclerView.Adapter))
                throw new RuntimeException("your adapter must be a RecyclerView.Adapter");
        }
        this.mInnerAdapter = myAdapter;
        myAdapter.setDRecyclerViewAdapter(this);
    }

    /**
     * head foot list cache
     */
    private List<View> mHeadViews = new ArrayList<View>();
    private List<View> mFootViews = new ArrayList<View>();
    private List<View> mRandomViews = new ArrayList<View>();
    private SparseArray<Integer> mRandomViews_position = new SparseArray<Integer>();

    /**
     * addHead to recyclerview
     *
     * @param view
     */
    public void addHeadView(View view) {
        mHeadViews.add(view);
    }

    /**
     * addFoot to RecyclerView
     *
     * @param view
     */
    public void addFootView(View view) {
        mFootViews.add(view);
    }

    /**
     * 使用一次 存下来 后续 好查找
     */
    private int index = 0;

    public void addRandomView(View view, int posistion) {
        mRandomViews_position.append(posistion, index);
        index++;
        mRandomViews.add(view);
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        DRecyclerViewHolder dRecyclerViewHolder;
        if (viewType < mHeadViews.size()) {
            Log.e(Tag, "headView" + viewType);
            return new DRecyclerViewHolder(mHeadViews.get(viewType));

        }
        else if (viewType >= mHeadViews.size() && viewType < mHeadViews.size() + mInnerAdapter.getItemCount()) {
            if (mRandomViews_position.get(viewType - mHeadViews.size()) != null) {
                View view = mRandomViews.get(mRandomViews_position.get(viewType - mHeadViews.size()));
                return new DRecyclerViewHolder(view);
            }
            return mInnerAdapter.onCreateViewHolder(parent, viewType - mHeadViews.size());
        }
        else {
            int position = viewType - mHeadViews.size() - mInnerAdapter.getItemCount();
            if (position >= 0 && position < mFootViews.size()) {
                return new DRecyclerViewHolder(mFootViews.get(position));
            }
            else {
                return null;
            }
        }
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if (position >= mHeadViews.size() && position < mHeadViews.size() + mInnerAdapter.getItemCount()) {
            //不包括那些插入的
            if (mRandomViews_position.get(position - mHeadViews.size()) == null)
                mInnerAdapter.onBindViewHolder(holder, position - mHeadViews.size());

        }
        else {
            /**
             * 瀑布流的设置处理
             */
            ViewGroup.LayoutParams layoutParams = holder.itemView.getLayoutParams();
            if (layoutParams instanceof StaggeredGridLayoutManager.LayoutParams) {
                ((StaggeredGridLayoutManager.LayoutParams) layoutParams).setFullSpan(true);
            }
        }
    }

    @Override
    public int getItemCount() {
        return mHeadViews.size() + mInnerAdapter.getItemCount() + mFootViews.size();
    }

    @Override
    public int getItemViewType(int position) {

        return position;
    }

    public int getFootSize() {
        return mFootViews.size();
    }

    public int getHeadSize() {
        return mHeadViews.size();
    }

    public boolean isHeader(int position) {
        return position < mHeadViews.size() ? true : false;
    }

    public boolean isFooter(int position) {
        return position >= mHeadViews.size() + mInnerAdapter.getItemCount() ? true : false;
    }

    public boolean isRandom(int position) {
        return mRandomViews_position.get(position - mHeadViews.size()) != null ? true : false;
    }

    static class DRecyclerViewHolder extends RecyclerView.ViewHolder {

        public DRecyclerViewHolder(View itemView) {
            super(itemView);
        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值