{"id":15027551,"url":"https://github.com/donkingliang/groupedrecyclerviewadapter","last_synced_at":"2025-05-15T23:07:10.663Z","repository":{"id":37706385,"uuid":"85827495","full_name":"donkingliang/GroupedRecyclerViewAdapter","owner":"donkingliang","description":"GroupedRecyclerViewAdapter可以很方便的实现RecyclerView的分组显示，并且每个组都可以包含组头、组尾和子项；可以方便实现多种Type类型的列表，可以实现如QQ联系人的列表一样的列表展开收起功能，还可以实现头部悬浮吸顶功能等。","archived":false,"fork":false,"pushed_at":"2022-08-13T02:01:28.000Z","size":2904,"stargazers_count":1656,"open_issues_count":33,"forks_count":217,"subscribers_count":28,"default_branch":"master","last_synced_at":"2025-05-15T23:06:55.435Z","etag":null,"topics":["android","android-library","group-list-items","recyclerview","recyclerview-adapter","sticky"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/donkingliang.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-03-22T12:55:01.000Z","updated_at":"2025-05-07T09:04:01.000Z","dependencies_parsed_at":"2022-07-21T22:02:57.891Z","dependency_job_id":null,"html_url":"https://github.com/donkingliang/GroupedRecyclerViewAdapter","commit_stats":null,"previous_names":[],"tags_count":29,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/donkingliang%2FGroupedRecyclerViewAdapter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/donkingliang%2FGroupedRecyclerViewAdapter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/donkingliang%2FGroupedRecyclerViewAdapter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/donkingliang%2FGroupedRecyclerViewAdapter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/donkingliang","download_url":"https://codeload.github.com/donkingliang/GroupedRecyclerViewAdapter/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254436948,"owners_count":22070947,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","android-library","group-list-items","recyclerview","recyclerview-adapter","sticky"],"created_at":"2024-09-24T20:06:39.650Z","updated_at":"2025-05-15T23:07:04.985Z","avatar_url":"https://github.com/donkingliang.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# GroupedRecyclerViewAdapter\n\nGroupedRecyclerViewAdapter可以很方便的实现RecyclerView的分组显示，并且每个组都可以包含组头、组尾和子项；可以方便实现多种Type类型的列表，可以实现如QQ联系人的列表一样的列表展开收起功能，还可以实现头部悬浮吸顶功能等。下面先让我们看一下它所能够实现的一些效果：\n\n### 效果图\n\n![分组的列表](https://github.com/donkingliang/GroupedRecyclerViewAdapter/blob/master/GroupedRecyclerViewAdapter%E6%BC%94%E7%A4%BA%E5%9B%BE/%E5%88%86%E7%BB%84%E7%9A%84%E5%88%97%E8%A1%A8.jpg) ![不带组尾的列表](https://github.com/donkingliang/GroupedRecyclerViewAdapter/blob/master/GroupedRecyclerViewAdapter%E6%BC%94%E7%A4%BA%E5%9B%BE/%E4%B8%8D%E5%B8%A6%E7%BB%84%E5%B0%BE%E7%9A%84%E5%88%97%E8%A1%A8.jpg) ![不带组头的列表](https://github.com/donkingliang/GroupedRecyclerViewAdapter/blob/master/GroupedRecyclerViewAdapter%E6%BC%94%E7%A4%BA%E5%9B%BE/%E4%B8%8D%E5%B8%A6%E7%BB%84%E5%A4%B4%E7%9A%84%E5%88%97%E8%A1%A8.jpg) ![子项为Grid的列表](https://github.com/donkingliang/GroupedRecyclerViewAdapter/blob/master/GroupedRecyclerViewAdapter%E6%BC%94%E7%A4%BA%E5%9B%BE/%E5%AD%90%E9%A1%B9%E4%B8%BAGrid%E7%9A%84%E5%88%97%E8%A1%A8.jpg) ![子项为Grid的列表(各组子项的Span不同)](https://github.com/donkingliang/GroupedRecyclerViewAdapter/blob/master/GroupedRecyclerViewAdapter%E6%BC%94%E7%A4%BA%E5%9B%BE/%E5%AD%90%E9%A1%B9%E4%B8%BAGrid%E7%9A%84%E5%88%97%E8%A1%A8(%E5%90%84%E7%BB%84%E5%AD%90%E9%A1%B9%E7%9A%84Span%E4%B8%8D%E5%90%8C).jpg) ![头、尾和子项都支持多种类型的列表](https://github.com/donkingliang/GroupedRecyclerViewAdapter/blob/master/GroupedRecyclerViewAdapter%E6%BC%94%E7%A4%BA%E5%9B%BE/%E5%A4%B4%E3%80%81%E5%B0%BE%E5%92%8C%E5%AD%90%E9%A1%B9%E9%83%BD%E6%94%AF%E6%8C%81%E5%A4%9A%E7%A7%8D%E7%B1%BB%E5%9E%8B%E7%9A%84%E5%88%97%E8%A1%A8.jpg)  \n\n![多种子项类型的列表](https://github.com/donkingliang/GroupedRecyclerViewAdapter/blob/master/GroupedRecyclerViewAdapter%E6%BC%94%E7%A4%BA%E5%9B%BE/%E5%A4%9A%E7%A7%8D%E5%AD%90%E9%A1%B9%E7%B1%BB%E5%9E%8B%E7%9A%84%E5%88%97%E8%A1%A8.jpg)\n\n还可以很容易的实时列表的展开收起效果：\n\n![可展开收起的列表](https://github.com/donkingliang/GroupedRecyclerViewAdapter/blob/master/GroupedRecyclerViewAdapter%E6%BC%94%E7%A4%BA%E5%9B%BE/%E5%8F%AF%E5%B1%95%E5%BC%80%E6%94%B6%E8%B5%B7%E7%9A%84%E5%88%97%E8%A1%A8.gif)\n\n还可以轻松实现头部悬浮吸顶的效果：\n\n![头部吸顶的列表](https://github.com/donkingliang/GroupedRecyclerViewAdapter/blob/master/GroupedRecyclerViewAdapter%E6%BC%94%E7%A4%BA%E5%9B%BE/%E5%A4%B4%E9%83%A8%E5%90%B8%E9%A1%B6%E7%9A%84%E5%88%97%E8%A1%A8.gif)\n\n以上展示的只是GroupedRecyclerViewAdapter能实现的一些常用效果，其实使用GroupedRecyclerViewAdapter还可以很容易的实现一些更加复杂的列表效果。在我的GroupedRecyclerViewAdapter项目的Demo中给出了上面几种效果的实现例子，并且有详细的注释说明，有兴趣的同学可以到我的GitHub下载源码。下面直接讲解GroupedRecyclerViewAdapter的使用。\n\n### 引入依赖 \n\n在Project的build.gradle在添加以下代码\n\n```\n\tallprojects {\n\t\trepositories {\n\t\t\t...\n\t\t\tmaven { url 'https://jitpack.io' }\n\t\t}\n\t}\n```\n在Module的build.gradle在添加以下代码\n\n```\n\nimplementation 'com.github.donkingliang:GroupedRecyclerViewAdapter:2.4.3'\n\n```\n\n### 基本使用\n\n**1、继承GroupedRecyclerViewAdapter**\n\n```java\npublic class GroupedListAdapter extends GroupedRecyclerViewAdapter {\n}\n```\n\n**2、实现GroupedRecyclerViewAdapter里的方法**\n\nGroupedRecyclerViewAdapter是一个抽象类，它提供了一系列需要子类去实现的方法。\n\n```java\n\t//返回组的数量\n\tpublic abstract int getGroupCount();\n\n\t//返回当前组的子项数量\n    public abstract int getChildrenCount(int groupPosition);\n\n\t//当前组是否有头部\n    public abstract boolean hasHeader(int groupPosition);\n\n\t//当前组是否有尾部\n    public abstract boolean hasFooter(int groupPosition);\n\n\t//返回头部的布局id。(如果hasHeader返回false，这个方法不会执行)\n    public abstract int getHeaderLayout(int viewType);\n\n\t//返回尾部的布局id。(如果hasFooter返回false，这个方法不会执行)\n    public abstract int getFooterLayout(int viewType);\n\n\t//返回子项的布局id。\n    public abstract int getChildLayout(int viewType);\n\n\t//绑定头部布局数据。(如果hasHeader返回false，这个方法不会执行)\n    public abstract void onBindHeaderViewHolder(BaseViewHolder holder, int groupPosition);\n\n\t//绑定尾部布局数据。(如果hasFooter返回false，这个方法不会执行)\n    public abstract void onBindFooterViewHolder(BaseViewHolder holder, int groupPosition);\n\n\t//绑定子项布局数据。\n    public abstract void onBindChildViewHolder(BaseViewHolder holder,\n                                               int groupPosition, int childPosition);\n```\n还可是重写GroupedRecyclerViewAdapter方法实现头、尾和子项的多种类型item。效果就像上面的第6张图一样。\n\n```java\n\t//返回头部的viewType。\n\tpublic int getHeaderViewType(int groupPosition);\n\n\t//返回尾部的viewType。\n    public int getFooterViewType(int groupPosition) ;\n\n\t//返回子项的viewType。\n    public int getChildViewType(int groupPosition, int childPosition) ;\n```\n**3、设置点击事件的监听**\n\nGroupedRecyclerViewAdapter提供了对列表的点击事件的监听方法。\n\n```java\n\t//设置组头点击事件\n    public void setOnHeaderClickListener(OnHeaderClickListener listener) {\n        mOnHeaderClickListener = listener;\n    }\n\n    //设置组尾点击事件\n    public void setOnFooterClickListener(OnFooterClickListener listener) {\n        mOnFooterClickListener = listener;\n    }\n\n    // 设置子项点击事件\n    public void setOnChildClickListener(OnChildClickListener listener) {\n        mOnChildClickListener = listener;\n    }\n```\n\n**4、设置空布局**\n\nGroupedRecyclerViewAdapter提供设置空布局的功能，如果列表没有数据的情况下可以显示一个空布局。\n```java\n// 显示空布局。默认不显示\nadapter.showEmptyView(true);\n```\n框架提供的默认空布局比较简单，可以通过复写getEmptyView自定义空布局\n```java\n    @Override\n    public View getEmptyView(ViewGroup parent) {\n    // 返回自定义空布局\n        View view = LayoutInflater.from(mContext).inflate(R.layout.adapter_empty_view, parent, false);\n        return view;\n    }\n```\n框架只提供空布局的设置方法，不会管理空布局。所以如果你的空布局有点击事件等其他的业务逻辑，也需要自己在这个方法实现。\n\n**5、使用ItemDecoration**\n\n从2.4.0版本开始，支持使用ItemDecoration。之前一直没有对GroupedRecyclerViewAdapter提供ItemDecoration的支持，是因为对于分组的列表，每个分组的ItemDecoration和组头、组尾的ItemDecoration都应该是可以单独设置样式的。这对于自定义ItemDecoration的实现比较麻烦，而且难以实现统一的设置和扩展方式。后来我实现了一个自定义ItemDecoration的库：[VariedItemDecoration](https://github.com/donkingliang/VariedItemDecoration)。使用VariedItemDecoration可以实现在一个列表里显示多种不同样式的ItemDecoration，并且可以非常简单的实现自定义ItemDecoration。基于VariedItemDecoration的实现基础，我实现了多样式ItemDecoration的分组管理，使ItemDecoration可以使用于GroupedRecyclerViewAdapter列表。我在库里提供了可直接使用的GroupedLinearItemDecoration/GroupedGridItemDecoration和用于自定义ItemDecoration的基类AbsGroupedLinearItemDecoration/AbsGroupedGridItemDecoration。\n\n下面我以线性列表为例，说明ItemDecoration使用。\n\n```java\n// 空白分割线，只需要设置分割线大小，不需要设置样式，divider为空则只添加间隔，不绘制样式\nGroupedLinearItemDecoration itemDecoration = new GroupedLinearItemDecoration(adapter,20, null,20,null,20,null);\n\n// 普通分割线，设置分割线大小和头、尾、子项的分割线样式\nGroupedLinearItemDecoration itemDecoration = new GroupedLinearItemDecoration(adapter,20, mHeaderDivider,20,mFooterDivider,20,mChildDivider);\n\n// 自定义分割线，可以根据需要设置每个item的分割线大小和样式\nCustomLinearItemDecoration itemDecoration = new CustomLinearItemDecoration(this,adapter);\n\n// 添加分割线\nrecyclerView.addItemDecoration(itemDecoration);\n\n// 自定义分割线\npublic class CustomLinearItemDecoration extends AbsGroupedLinearItemDecoration {\n\n    private Drawable headerDivider;\n    private Drawable footerDivider;\n    private Drawable childDivider1;\n    private Drawable childDivider2;\n\n    public CustomLinearItemDecoration(Context context,GroupedRecyclerViewAdapter adapter) {\n        super(adapter);\n\n        headerDivider = context.getResources().getDrawable(R.drawable.green_divider);\n        footerDivider = context.getResources().getDrawable(R.drawable.purple_divider);\n        childDivider1 = context.getResources().getDrawable(R.drawable.pink_divider);\n        childDivider2 = context.getResources().getDrawable(R.drawable.orange_divider);\n    }\n\n    @Override\n    public int getChildDividerSize(int groupPosition, int ChildPosition) {\n        // 根据position返回分割线的大小\n        return 20;\n    }\n\n    @Override\n    public Drawable getChildDivider(int groupPosition, int ChildPosition) {\n        // 根据position返回Drawable 可以为null\n        if(groupPosition % 2 == 0){\n            return childDivider1;\n        } else {\n            return childDivider2;\n        }\n    }\n\n    @Override\n    public int getHeaderDividerSize(int groupPosition) {\n        // 根据position返回分割线的大小\n        return 30;\n    }\n\n    @Override\n    public Drawable getHeaderDivider(int groupPosition) {\n        // 根据position返回Drawable 可以为null\n        return headerDivider;\n    }\n\n    @Override\n    public int getFooterDividerSize(int groupPosition) {\n        // 根据position返回分割线的大小\n        return 30;\n    }\n\n    @Override\n    public Drawable getFooterDivider(int groupPosition) {\n        // 根据position返回Drawable 可以为null\n        return footerDivider;\n    }\n}\n```\n对于网格列表的ItemDecoration，使用也是一样的，大家可以看我demo中的例子。\n\n如果你想在普通的RecyclerView中使用这种多样式的ItemDecoration，请使用[VariedItemDecoration](https://github.com/donkingliang/VariedItemDecoration)。\n\n###  注意事项\n\n**1、对方法重写的注意。**\n\n如果我们直接继承RecyclerView.Adapter去实现自己的Adapter时，一般会重写Adapter中的以下几个方法：\n\n```java\npublic RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType);\n\npublic void onBindViewHolder(RecyclerView.ViewHolder holder, int position);\n\npublic int getItemCount();\n\npublic int getItemViewType(int position);\n```\n但如果是使用GroupedRecyclerViewAdapter，就一定不能去重写这几个方法，因为在GroupedRecyclerViewAdapter中已经对这几个方法做了实现，而且是对实现列表分组至关重要的，如果子类重写了这几个方法，可能会破坏GroupedRecyclerViewAdapter的功能。\n从前面给出的GroupedRecyclerViewAdapter的方法我们可以看到，这些方法其实就是对应RecyclerView.Adapter的这4个方法的，所以我们直接使用GroupedRecyclerViewAdapter提供的方法即可。\nRecyclerView.Adapter中的\n```java\n\tpublic RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType);\n\n```\n对应GroupedRecyclerViewAdapter中的\n```java\n\t//返回头部的布局id。(如果hasHeader返回false，这个方法不会执行)\n    public abstract int getHeaderLayout(int viewType);\n\n\t//返回尾部的布局id。(如果hasFooter返回false，这个方法不会执行)\n    public abstract int getFooterLayout(int viewType);\n\n\t//返回子项的布局id。\n    public abstract int getChildLayout(int viewType);\n```\n这里之所以返回的是布局id而不是ViewHolder ，是因为在GroupedRecyclerViewAdapter项目中已经提供了一个通用的ViewHolder：BaseViewHolder。所以使用者只需要提供布局的id即可，不需要自己去实现ViewHolder。\n\n```java\n\t@Override\n    public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {\n        View view = LayoutInflater.from(mContext).inflate(getLayoutId(mTempPosition, viewType), parent, false);\n        return new BaseViewHolder(view);\n    }\n\n    private int getLayoutId(int position, int viewType) {\n        int type = judgeType(position);\n        if (type == TYPE_HEADER) {\n            return getHeaderLayout(viewType);\n        } else if (type == TYPE_FOOTER) {\n            return getFooterLayout(viewType);\n        } else if (type == TYPE_CHILD) {\n            return getChildLayout(viewType);\n        }\n        return 0;\n    }\n```\nRecyclerView.Adapter中的\n```java\n\tpublic void onBindViewHolder(RecyclerView.ViewHolder holder, int position);\n```\n对应GroupedRecyclerViewAdapter中的\n\n```java\n\t//绑定头部布局数据。(如果hasHeader返回false，这个方法不会执行)\n    public abstract void onBindHeaderViewHolder(BaseViewHolder holder, int groupPosition);\n\n\t//绑定尾部布局数据。(如果hasFooter返回false，这个方法不会执行)\n    public abstract void onBindFooterViewHolder(BaseViewHolder holder, int groupPosition);\n\n\t//绑定子项布局数据。\n    public abstract void onBindChildViewHolder(BaseViewHolder holder,\n                                               int groupPosition, int childPosition);\n```\nRecyclerView.Adapter中的\n```java\n\tpublic int getItemCount();\n```\n对应GroupedRecyclerViewAdapter中的\n\n```java\n\t//返回组的数量\n\tpublic abstract int getGroupCount();\n\n\t//返回当前组的子项数量\n    public abstract int getChildrenCount(int groupPosition);\n\n```\nRecyclerView.Adapter中的\n```java\n\tpublic int getItemViewType(int position);\n```\n对应GroupedRecyclerViewAdapter中的\n\n```java\n\t//返回头部的viewType。\n\tpublic int getHeaderViewType(int groupPosition);\n\n\t//返回尾部的viewType。\n    public int getFooterViewType(int groupPosition) ;\n\n\t//返回子项的viewType。\n    public int getChildViewType(int groupPosition, int childPosition) ;\n```\n\n**2、对列表操作的注意**\n\nRecyclerView.Adapter提供了一系列对列表进行操作的方法。如：\n\n```java\n//更新操作\npublic final void notifyDataSetChanged();\npublic final void notifyItemChanged(int position);\npublic final void notifyItemChanged(int position, Object payload);\npublic final void notifyItemRangeChanged(int positionStart, int itemCount);\npublic final void notifyItemRangeChanged(int positionStart, int itemCount, Object payload);\n\n//插入操作\npublic final void notifyItemInserted(int position);\npublic final void notifyItemRangeInserted(int positionStart, int itemCount);\n\n//删除操作\npublic final void notifyItemRemoved(int position)\npublic final void notifyItemRangeRemoved(int positionStart, int itemCount);\n```\n在GroupedRecyclerViewAdapter不建议使用RecyclerView.Adapter的任何对列表的操作方法，因为这些方法都是基于列表的操作，它的position是相对于整个列表而言的，而GroupedRecyclerViewAdapter是分组的列表，它对列表的操作应该是基于组的。同时GroupedRecyclerViewAdapter使用了组结构来维护整个列表的结构，使我们可以对列表进行组的操作，在列表发生变化时GroupedRecyclerViewAdapter需要及时对组结构进行调整，如果使用了RecyclerView.Adapter中的方法对列表进行更新，GroupedRecyclerViewAdapter可能因为无法及时调整组结构而发生异常。所以在使用中应该避免使用这些方法。GroupedRecyclerViewAdapter同样提供了一系列对列表进行操作的方法，我们应该使用GroupedRecyclerViewAdapter所提供的方法。\n\n```java\n\t //****** 刷新操作 *****//\n\n    //通知数据列表刷新。对应 notifyDataSetChanged();\n    public void notifyDataChanged();\n\n    //通知一组数据刷新，包括组头,组尾和子项\n    public void notifyGroupChanged(int groupPosition);\n\n    //通知多组数据刷新，包括组头,组尾和子项\n    public void notifyGroupRangeChanged(int groupPosition, int count);\n\n    // 通知组头刷新\n    public void notifyHeaderChanged(int groupPosition);\n\n    // 通知组尾刷新\n    public void notifyFooterChanged(int groupPosition);\n\n    // 通知一组里的某个子项刷新\n    public void notifyChildChanged(int groupPosition, int childPosition);\n\n    // 通知一组里的多个子项刷新\n    public void notifyChildRangeChanged(int groupPosition, int childPosition, int count);\n\n    // 通知一组里的所有子项刷新\n    public void notifyChildrenChanged(int groupPosition);\n\n    //****** 删除操作 *****//\n    // 通知所有数据删除\n    public void notifyDataRemoved();\n\n    // 通知一组数据删除，包括组头,组尾和子项\n    public void notifyGroupRemoved(int groupPosition);\n\n    // 通知多组数据删除，包括组头,组尾和子项\n    public void notifyGroupRangeRemoved(int groupPosition, int count);\n\n    // 通知组头删除\n    public void notifyHeaderRemoved(int groupPosition);\n\n    // 通知组尾删除\n    public void notifyFooterRemoved(int groupPosition);\n\n    // 通知一组里的某个子项删除\n    public void notifyChildRemoved(int groupPosition, int childPosition);\n\n    // 通知一组里的多个子项删除\n    public void notifyChildRangeRemoved(int groupPosition, int childPosition, int count);\n\n    // 通知一组里的所有子项删除\n    public void notifyChildrenRemoved(int groupPosition);\n    \n    //****** 插入操作 *****//\n    // 通知一组数据插入\n    public void notifyGroupInserted(int groupPosition);\n\n    // 通知多组数据插入\n    public void notifyGroupRangeInserted(int groupPosition, int count);\n\n    // 通知组头插入\n    public void notifyHeaderInserted(int groupPosition);\n    \n    // 通知组尾插入\n    public void notifyFooterInserted(int groupPosition);\n\n    // 通知一个子项到组里插入\n    public void notifyChildInserted(int groupPosition, int childPosition);\n\n    // 通知一组里的多个子项插入\n    public void notifyChildRangeInserted(int groupPosition, int childPosition, int count);\n\n    // 通知一组里的所有子项插入\n    public void notifyChildrenInserted(int groupPosition);\n```\n***注意：*** GroupedRecyclerViewAdapter不管理列表数据源，在调用notifyxxxRemoved或者notifyxxxInserted等方法刷新列表前，请相应的刷新数据源。也就是说，对数据的操作应该写在对列表的刷新前。\n\n**3、使用GridLayoutManager的注意**\n\n如果要使用GridLayoutManager，一定要使用项目中所提供的GroupedGridLayoutManager。因为分组列表如果要使用GridLayoutManager实现网格布局，就要保证组的头部和尾部是要单独占用一行的。否则组的头、尾可能会跟子项混着一起，造成布局混乱。同时GroupedGridLayoutManager提供了对子项的SpanSize的修改方法，使用GroupedGridLayoutManager可以实现更多的复杂列表布局。\n\n```java\n\t//直接使用GroupedGridLayoutManager实现子项的Grid效果\n    GroupedGridLayoutManager gridLayoutManager = new GroupedGridLayoutManager(this, 2, adapter);\n   rvList.setLayoutManager(gridLayoutManager);\n   \n\n   GroupedGridLayoutManager gridLayoutManager = new GroupedGridLayoutManager(this, 4, adapter){\n       //重写这个方法 改变子项的SpanSize。\n       //这个跟重写SpanSizeLookup的getSpanSize方法的使用是一样的。\n       @Override\n       public int getChildSpanSize(int groupPosition, int childPosition) {\n            if(groupPosition % 2 == 1){\n                 return 2;\n            }\n            return super.getChildSpanSize(groupPosition, childPosition);\n       }\n   };\n   rvList.setLayoutManager(gridLayoutManager);\n```\n\n**4、BaseViewHolder的使用**\n\n项目中提供了一个通用的ViewHolder：BaseViewHolder。提供了根据viewId获取View的方法和对View、TextView、ImageView的常用设置方法。\n\n```java\n//根据id获取View\nTextView  textView = holder.get(R.id.tv_header);\n\n//View、TextView、ImageView的常用设置方法。并且支持方法连缀调用\nholder.setText(R.id.tv_header, \"内容\")\n                .setImageResource(R.id.iv_image, 资源id)\n                .setBackgroundRes(R.id.view,资源id);\n```\nBaseViewHolder是可以通用的，在普通的Adapter中也可以使用，可以省去每次都要创建ViewHolder的麻烦。\n\n**5、头部悬浮吸顶功能**\n\n应一些朋友的反馈，我在1.2.0版本中新加了列表的头部悬浮吸顶功能。使用起来非常的简单，只需要用框架里提供的StickyHeaderLayout包裹一下你的RecyclerView就可以了。当然，你需要使用GroupedRecyclerViewAdapter才能看到效果。\n\n```xml\n    \u003c!-- 用StickyHeaderLayout包裹RecyclerView --\u003e\n    \u003ccom.donkingliang.groupedadapter.widget.StickyHeaderLayout\n        android:id=\"@+id/sticky_layout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\u003e\n\n        \u003candroidx.recyclerview.widget.RecyclerView\n            android:id=\"@+id/rv_list\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\" /\u003e\n    \u003c/com.donkingliang.groupedadapter.widget.StickyHeaderLayout\u003e\n```\nStickyHeaderLayout提供了一个设置是否显示悬浮吸顶的方法。\n```java\n\t//是否吸顶，默认为true。\n\tstickyLayout.setSticky(true);\n```\n\n**6、使用DataBinding**\n\nGroupedRecyclerViewAdapter在1.3.0版本加入了对DataBinding的支持。要想在Adapter中使用DataBinding，只需要在GroupedRecyclerViewAdapter的构造函数的useBinding参数传true即可。\n```java\npublic class BindingAdapter extends GroupedRecyclerViewAdapter {\n\n    public BindingAdapter(Context context) {\n    \t//只要在这里传true，Adapter就会用DataBinding的方式加载列表的item布局。默认为false。\n        super(context, true);\n    }\n}\n```\n然后同过BaseViewHolder的getBinding()就可以获取到item对应的ViewDataBinding对象。\n```java\n    @Override\n    public void onBindHeaderViewHolder(BaseViewHolder holder, int groupPosition) {\n    \t//获取ViewDataBinding对象。\n        AdapterBindingHeaderBinding binding = holder.getBinding();\n    }\n\n    @Override\n    public void onBindFooterViewHolder(BaseViewHolder holder, int groupPosition) {\n    \t//获取ViewDataBinding对象。\n        AdapterBindingFooterBinding binding = holder.getBinding();\n    }\n\n    @Override\n    public void onBindChildViewHolder(BaseViewHolder holder, int groupPosition, int childPosition) {\n    \t//获取ViewDataBinding对象。\n        AdapterBindingChildBinding binding = holder.getBinding();\n    }\n```\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdonkingliang%2Fgroupedrecyclerviewadapter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdonkingliang%2Fgroupedrecyclerviewadapter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdonkingliang%2Fgroupedrecyclerviewadapter/lists"}