RecyclerView通常只有一个header和footer,但是像手机相册这种布局每个item都会有一个header该怎么办,其中一种办法就是RecyclerView嵌套RecyclerView,虽然能实现但是并不怎么友好,如何只创建一个RecyclerView就实现这种布局呢?
在github上找到了SectionedRecyclerView,不需要改动RecyclerView,定义adapter的时候只需要继承SectionedRecyclerViewAdapter即可,首先来看效果图
但是SectionedRecyclerViewAdapter使用的时候比平时的adapter多一些方法,下面简单介绍一下:
- SectionedRecyclerView这个库提供了两种adapter,一个是SectionedRecyclerViewAdapter,功能比较完成,有footer,另一个是SimpleSectionedAdapter,顾名思义就是简化版,只是有header,不需要footer
- 继承SectionedRecyclerViewAdapter时,通过hasFooterInSection设置是否显示footer布局
下面贴出继承两种adapter的代码,方法的注释都写在上面了,只是比普通的adapter多了header和footer布局
继承SectionedRecyclerViewAdapter:
/**
* @Description: 完整的adapter
* 注意:通过hasFooterInSection()这个方法来设置是否需要显示footer
* @author: ZhangYW
* @time: 2019/1/24 9:39
*/
public class MyAdapter extends SectionedRecyclerViewAdapter<MyAdapter.MyHeaderViewHolder, MyAdapter.MyItemViewHolder, MyAdapter.MyFooterViewHolder> {
private Context mContext;
private List<MyBean> mList;
public MyAdapter(Context context, List<MyBean> list) {
this.mContext = context;
this.mList = list;
}
/**
* header或者footer的个数
* @return
*/
@Override
protected int getSectionCount() {
return mList.size();
}
/**
* 每个header或者footer中包含具体的内容个数
* @return
*/
@Override
protected int getItemCountForSection(int section) {
return mList.get(section).getList().size();
}
/**
* 是否显示footer
* @param section
* @return
*/
@Override
protected boolean hasFooterInSection(int section) {
return true;
}
/**
* 渲染具体的HeaderViewHolder
*
* @param parent HeaderViewHolder的容器
* @param viewType 一个标志,我们根据该标志可以实现渲染不同类型的ViewHolder
* @return
*/
@Override
protected MyHeaderViewHolder onCreateSectionHeaderViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(mContext).inflate(R.layout.item_rv_heade