为RecyclerView添加头部和尾部

来源:互联网 发布:淘宝怎么认证代购点 编辑:程序博客网 时间:2024/05/22 23:59

当我们想给RecyclerView加个headerView或者footerView的时候,我们都会直接想到直接调用addHeaderView(),因为我们之前在用ListView的时候都是这样干的,但是很遗憾,RecyclerView并没有提供这样的api方法,那我们就不能添加头部和尾部了吗?当然不是啦,我们可以自己来扩展,下面我们就开始来实现下这个功能.
1,其实HeaderView实际上也是Item的一种,只不过显示在顶部的位置,那么我们完全可以通过为其设置ItemType来完成。我们可以直接在适配器中通过itemType来添加一个item,但是这样做的话,其他的几个方法都要跟着修改,比如说getItemType,getItemCount,
onBindViewHolder,等,这样的话代码修改的幅度比较大,不建议这么做,那么我们能不能设计一个类呢,可以无缝的为原有的Adapter添加headerView和footerView。
2,通过类似装饰者模式,去设计一个类,增强原有Adapter的功能,使其支持addHeaderView和addFooterView。这样我们就可以不去改动我们之前已经完成的代码,灵活的去扩展功能了.下面请看代码,

具体的看代码

package com.example.mysample.common;import android.support.v7.widget.GridLayoutManager;import android.support.v7.widget.RecyclerView;import android.support.v7.widget.StaggeredGridLayoutManager;import android.util.SparseArray;import android.view.View;import android.view.ViewGroup;/** * Created by Administrator on 2016/9/27. */public class HeaderAndFooterWrapper extends RecyclerView.Adapter<RecyclerView.ViewHolder> {    private static final int TYPE_HEADER = 100000;    private static final int TYPE_FOOTER = 200000;    private SparseArray<View> mHeaderViews;    private SparseArray<View> mFooterViews;    private RecyclerView.Adapter mInnerAdapter;    public HeaderAndFooterWrapper(RecyclerView.Adapter innerAdapter) {        mInnerAdapter = innerAdapter;        mHeaderViews = new SparseArray<>();        mFooterViews = new SparseArray<>();    }    @Override    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        //创建添加头部的ViewHolder        if ( mHeaderViews.get(viewType) != null){            ViewHolder viewHolder = ViewHolder.createViewHolder(parent.getContext(),mHeaderViews.get(viewType));            return viewHolder;        }else if (mFooterViews.get(viewType) != null){            //创建添加尾部的ViewHolder            ViewHolder viewHolder = ViewHolder.createViewHolder(parent.getContext(),mFooterViews.get(viewType));            return viewHolder;        }        //创建正常状态的ViewHolder        return mInnerAdapter.onCreateViewHolder(parent,viewType);    }    @Override    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {            if (isFooterViewPos(position)){                return;            }else if (isHeaderViewPos(position)){                return;            }            mInnerAdapter.onBindViewHolder(holder,position - getHeadersCount());    }    @Override    public int getItemViewType(int position) {        if (isHeaderViewPos(position)){            //头部的itemViewType            return mHeaderViews.keyAt(position);        }else if (isFooterViewPos(position)){            //尾部的itemViewType            return mFooterViews.keyAt(position - getHeadersCount() - getListItemCount());        }        return mInnerAdapter.getItemViewType(position - getHeadersCount());    }    @Override    public int getItemCount() {        //头部的数量 + 尾部的数量 + 列表的item数量        return getListItemCount() + getHeadersCount() + getFootersCount();    }    private boolean isHeaderViewPos(int position){        return position < getHeadersCount();    }    private boolean isFooterViewPos(int posiiton){        return posiiton >= getListItemCount() + getHeadersCount();    }    /**     * 列表的item数量     * @return     */    public int getListItemCount(){        return mInnerAdapter.getItemCount();    }    /**     * 添加头部     * @param view 头部view     */    public void addHeaderView(View view){        mHeaderViews.put(mHeaderViews.size() + TYPE_HEADER,view);    }    /**     * 添加头部     * @param index 头部的key值     * @param view 头部的View     */    public void addHeaderView(int index,View view){        mHeaderViews.put(index + TYPE_HEADER,view);    }    /**     * 添加尾部     * @param view 尾部的View     */    public void addFooterView(View view){        mFooterViews.put(mFooterViews.size() + TYPE_FOOTER ,view);    }    /**     * 添加尾部     * @param index 尾部的key值     * @param view  尾部的view     */    public void addFooterView(int index,View view){        mFooterViews.put(index + TYPE_FOOTER,view);    }    /**     *     * @return 头部的数量     */    public int getHeadersCount(){        return mHeaderViews.size();    }    /**     *     * @return 尾部的数量     */    public int getFootersCount(){        return mFooterViews.size();    }     @Override    public void onAttachedToRecyclerView(RecyclerView recyclerView) {        super.onAttachedToRecyclerView(recyclerView);        mInnerAdapter.onAttachedToRecyclerView(recyclerView);        final RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();        if (layoutManager instanceof GridLayoutManager){            final GridLayoutManager gridLayoutManager = (GridLayoutManager) layoutManager;            final GridLayoutManager.SpanSizeLookup spanSizeLookup = gridLayoutManager.getSpanSizeLookup();            gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {                @Override                public int getSpanSize(int position) {                    int viewType = getItemViewType(position);                    if(mHeaderViews.get(viewType) != null){                        return gridLayoutManager.getSpanCount();                    }else if (mFooterViews.get(viewType) != null){                        return gridLayoutManager.getSpanCount();                    }                    if (spanSizeLookup != null){                        return spanSizeLookup.getSpanSize(position);                    }                    return 1;                }            });            gridLayoutManager.setSpanCount(gridLayoutManager.getSpanCount());        }    }    @Override    public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) {        mInnerAdapter.onViewAttachedToWindow(holder);        int position = holder.getLayoutPosition();        if (isHeaderViewPos(position) || isFooterViewPos(position)) {            ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams();            if (lp != null && lp instanceof StaggeredGridLayoutManager.LayoutParams) {                StaggeredGridLayoutManager.LayoutParams p = (StaggeredGridLayoutManager.LayoutParams) lp;                p.setFullSpan(true);            }        }    }

然后再测试:

package com.example.mysample;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.GridLayoutManager;import android.support.v7.widget.RecyclerView;import android.view.LayoutInflater;import android.view.View;import com.example.mysample.common.HeaderAndFooterWrapper;import com.example.mysample.common.MyAdapter2;import java.util.ArrayList;import java.util.List;public class HeaderAndFooterActivity extends AppCompatActivity {    private RecyclerView mRecyclerView;    private List<User> mList;    private MyAdapter2 mAdapter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        init();    }    private void init() {        mList = new ArrayList<>();        for (int i = 0 ;i<20 ;i++){            User user = new User();            user.setAddress( i% 2==0 ? "深圳"+i:"北京"+i);            user.setUserName( i% 2==0 ? "周杰伦"+i:"昆凌"+i);            mList.add(user);        }        mAdapter = new MyAdapter2(mList,this);        HeaderAndFooterWrapper wrapper = new HeaderAndFooterWrapper(mAdapter);        View header1 = LayoutInflater.from(this).inflate(R.layout.head_layout,null,false);        View header2 = LayoutInflater.from(this).inflate(R.layout.head_layout2,null,false);        View footer1 = LayoutInflater.from(this).inflate(R.layout.footer_layout,null,false);        View footer2 = LayoutInflater.from(this).inflate(R.layout.footer_layout02,null,false);        wrapper.addHeaderView(1,header1);        wrapper.addHeaderView(2,header2);        wrapper.addFooterView(1,footer1);        wrapper.addFooterView(2,footer2);        mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);      RecyclerView.LayoutManager layoutManager  = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false); //       GridLayoutManager layoutManager = new GridLayoutManager(this,2);        mRecyclerView.setLayoutManager(layoutManager);        mRecyclerView.setAdapter(wrapper);    }}

这样就完成了这个功能了,是不是很简单了,赶紧去试试下吧

0 0
原创粉丝点击