为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
- 为RecyclerView添加头部和尾部
- RecyclerView添加头部和尾部
- RecyclerView添加头部和尾部
- RecyclerView添加头部尾部
- RecyclerView 添加头部和尾部布局
- Android RecyclerView添加头部和尾部
- RecyclerView 添加头部和尾部布局
- RecyclerView 添加头部和尾部布局
- Android RecyclerView添加头部和尾部
- recyclerview 添加头部和尾部的优雅
- Android 给RecyclerView添加头部和尾部
- (4.1.45.1)RecyclerView 添加头部和尾部布局 一
- RecyclerView学习(1) 添加头部和尾部
- RecyclerView添加头部和尾部并解决no
- RecyclerView LayoutManager分析 添加头部尾部
- 实战RecyclerView头部尾部添加方法
- Android RecyclerView添加头部与尾部
- ListView 添加头部和尾部
- IntelliJ IDEA 文件隐藏
- 8天学通MongoDB——第六天 分片技术
- shell 笔记
- DynamicJson 让.net和js似的操作json
- Python——使用dict和set
- 为RecyclerView添加头部和尾部
- 2.修道士和野人问题
- multimedia debug methods
- ES6 let不存在变量提升
- 8天学通MongoDB——第七天 运维技术
- 什么是序列化和反序列化
- perl学习笔记-----------------------(8)
- 为什么直接杀死线程是不好的
- Java根据IP地址获取详细地域信息