使用RecyclerView添加Header和Footer的方法

xiaoxiao2021-02-28  84

RecyclerView虽然作为ListView的替代者有着较好的性能提升,但是ListView的一些常用功能却没有提供,比如我们平时会经常用到的addHeaderView,addFooterView,既然RecyclerView没有提供这个方法,我们应该如何为列表添加头部和底部呢?通过看ListView的源码可以知道ListView的添加Header和Footer是靠Adapter里面动态添加的,所以我们按照这个思路也给RecyclerView添加HeaderView和FooterView,先看一下效果:

import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; /** * Created by Lijizhou on 2016/2/24. * Blog:http://blog.csdn.net/leejizhou * QQ:3107777777 */ public class HeaderBottomAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { //item类型 public static final int ITEM_TYPE_HEADER = 0; public static final int ITEM_TYPE_CONTENT = 1; public static final int ITEM_TYPE_BOTTOM = 2; //模拟数据 public String[] texts = {"java", "python", "C++", "Php", ".NET", "js", "Ruby", "Swift", "OC"}; private LayoutInflater mLayoutInflater; private Context mContext; private int mHeaderCount = 1;//头部View个数 private int mBottomCount = 1;//底部View个数 public HeaderBottomAdapter(Context context) { mContext = context; mLayoutInflater = LayoutInflater.from(context); } //内容长度 public int getContentItemCount() { return texts.length; } //判断当前item是否是HeadView public boolean isHeaderView(int position) { return mHeaderCount != 0 && position < mHeaderCount; } //判断当前item是否是FooterView public boolean isBottomView(int position) { return mBottomCount != 0 && position >= (mHeaderCount + getContentItemCount()); } //判断当前item类型 @Override public int getItemViewType(int position) { int dataItemCount = getContentItemCount(); if (mHeaderCount != 0 && position < mHeaderCount) { //头部View return ITEM_TYPE_HEADER; } else if (mBottomCount != 0 && position >= (mHeaderCount + dataItemCount)) { //底部View return ITEM_TYPE_BOTTOM; } else { //内容View return ITEM_TYPE_CONTENT; } } //内容 ViewHolder public static class ContentViewHolder extends RecyclerView.ViewHolder { private TextView textView; public ContentViewHolder(View itemView) { super(itemView); textView = (TextView) itemView.findViewById(R.id.tv_item_text); } } //头部 ViewHolder public static class HeaderViewHolder extends RecyclerView.ViewHolder { public HeaderViewHolder(View itemView) { super(itemView); } } //底部 ViewHolder public static class BottomViewHolder extends RecyclerView.ViewHolder { public BottomViewHolder(View itemView) { super(itemView); } } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == ITEM_TYPE_HEADER) { return new HeaderViewHolder(mLayoutInflater.inflate(R.layout.rv_header, parent, false)); } else if (viewType == mHeaderCount) { return new ContentViewHolder(mLayoutInflater.inflate(R.layout.rv_item, parent, false)); } else if (viewType == ITEM_TYPE_BOTTOM) { return new BottomViewHolder(mLayoutInflater.inflate(R.layout.rv_footer, parent, false)); } return null; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if (holder instanceof HeaderViewHolder) { } else if (holder instanceof ContentViewHolder) { ((ContentViewHolder) holder).textView.setText(texts[position - mHeaderCount]); } else if (holder instanceof BottomViewHolder) { } } @Override public int getItemCount() { return mHeaderCount + getContentItemCount() + mBottomCount; } }

这里注意一点,如果你的RecyclerView使用Grid类型列表在设置Adapter后需要调用这个方法,根据当前Item类型来判断占据的横向格数,这也是Adapter里面实现isHeaderView和isBottomView的缘故

gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { return (adapter.isHeaderView(position) || adapter.isBottomView(position)) ? gridLayoutManager.getSpanCount() : 1; } }); Ok,RecyclerView添加Header和Footer就这样轻松实现了,你也可以把Adapter再次封装更有利于日常的开发。

转载请注明原文地址: https://www.6miu.com/read-76102.html

最新回复(0)