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

来源:互联网 发布:spss剔除异常数据 编辑:程序博客网 时间:2024/05/22 16:49

通过重写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);        }    }}


阅读全文
0 0
原创粉丝点击