客官先看图:
https://github.com/angcyo/ContactsPicker/blob/master/screenshot/1%E6%9C%88-15-2017%2016-17-46.gif

RecyclerView中实现分组功能, 和 实现分割线 使用的是相同原理. 就是手动绘制信息.

都是继承RecyclerView.ItemDecoration

分割线的实现传送门:http://blog.csdn.net/angcyo/article/details/52829707


1:为分组信息腾出空间

//这个方法就是用来描述是否需要给第二个参数view的上下左右腾出空间.
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {final RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();//布局管理器if (!(layoutManager instanceof LinearLayoutManager)) {throw new IllegalArgumentException("暂不支持 " + layoutManager.getClass().getSimpleName());}if (mGroupCallBack == null) {return;}final RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) view.getLayoutParams();final int adapterPosition = layoutParams.getViewAdapterPosition();if (adapterPosition == 0) {//第一个位置, 肯定是有分组信息的//我这里需要支持横向和竖向,所以加了方向判断.可以取消掉.if (((LinearLayoutManager) layoutManager).getOrientation() == LinearLayoutManager.HORIZONTAL) {//为左边腾出空间outRect.set(mGroupCallBack.getGroupHeight(), 0, 0, 0);} else {//为上边腾出空间outRect.set(0, mGroupCallBack.getGroupHeight(), 0, 0);}} else {//上一个分组信息String preGroupText = mGroupCallBack.getGroupText(adapterPosition - 1);//当前的分组信息String groupText = mGroupCallBack.getGroupText(adapterPosition);if (!TextUtils.equals(preGroupText, groupText)) {//如果和上一个分组信息不相等if (((LinearLayoutManager) layoutManager).getOrientation() == LinearLayoutManager.HORIZONTAL) {outRect.set(mGroupCallBack.getGroupHeight(), 0, 0, 0);} else {outRect.set(0, mGroupCallBack.getGroupHeight(), 0, 0);}}}
}

2:空间已经给出来了,那么就是绘制你想要的信息了

@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {if (mGroupCallBack == null) {return;}//需要注意的就是, 绘制是从屏幕上布局了多少个子View开始的.
//也就是说, 你并不需要考虑不在屏幕上View的情况.
//通过parent.getChildCount()拿到的就是屏幕上布局了多少个子View的数量for (int i = 0; i < parent.getChildCount(); i++) {final View view = parent.getChildAt(i);final RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) view.getLayoutParams();final int adapterPosition = layoutParams.getViewAdapterPosition();if (adapterPosition == 0) {//第一个位置, 肯定是有分组信息的mGroupCallBack.onGroupDraw(c, view, adapterPosition);} else {//上一个分组信息String preGroupText = mGroupCallBack.getGroupText(adapterPosition - 1);//当前的分组信息String groupText = mGroupCallBack.getGroupText(adapterPosition);if (!TextUtils.equals(preGroupText, groupText)) {//如果和上一个分组信息不相等mGroupCallBack.onGroupDraw(c, view, adapterPosition);}}}
}

通过以上2个方法, 已经可以实现分割线了.

如果需要悬停效果, 那么就继续往下看.

3:悬停效果
onDrawOver方法和onDraw方法完全一样. 只不过名字不一样而已.
你完全可以在onDraw方法中, 实现.
但是官方竟然给了我们这种方法, 而且名字都取得那么好…我们又有什么理由不使用呢?

@Overridepublic void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {if (mGroupCallBack == null || parent.getChildCount() <= 0) {return;}boolean isHorizontal = ((LinearLayoutManager) parent.getLayoutManager()).getOrientation() == LinearLayoutManager.HORIZONTAL;final View view = parent.getChildAt(0);final RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) view.getLayoutParams();final int adapterPosition = layoutParams.getViewAdapterPosition();if (adapterPosition == 0) {//第一个位置, 肯定是有分组信息的if ((isHorizontal ? view.getLeft() : view.getTop()) <= 0) {mGroupCallBack.onGroupOverDraw(c, view, adapterPosition, 0);} else {mGroupCallBack.onGroupOverDraw(c, view, adapterPosition, mGroupCallBack.getGroupHeight() - (isHorizontal ? view.getLeft() : view.getTop()));}} else {if (parent.getLayoutManager().getItemCount() > adapterPosition + 1) {//下一个分组信息String nextGroupText = mGroupCallBack.getGroupText(adapterPosition + 1);//当前的分组信息String groupText = mGroupCallBack.getGroupText(adapterPosition);final View nextView = parent.getChildAt(1);if (!TextUtils.equals(nextGroupText, groupText)) {if ((isHorizontal ? nextView.getLeft() : nextView.getTop()) <= 0) {mGroupCallBack.onGroupOverDraw(c, view, adapterPosition, 0);} else {mGroupCallBack.onGroupOverDraw(c, view, adapterPosition,Math.max(0, 2 * mGroupCallBack.getGroupHeight() - (isHorizontal ? nextView.getLeft() : nextView.getTop())));}} else {mGroupCallBack.onGroupOverDraw(c, view, adapterPosition, 0);}} else {mGroupCallBack.onGroupOverDraw(c, view, adapterPosition, 0);}}}

开源地址:https://github.com/angcyo/ContactsPicker


至此: 文章就结束了,如有疑问: QQ群 Android:274306954 Swift:399799363 欢迎您的加入.

Android--RecyclerView分组悬浮标题(分割线)相关推荐

  1. RecyclerView实现收缩分组悬浮列表

    今天给大伙儿分享一个用RecyclerView实现收缩分组悬浮列表的功能.如果只是想实现分组收缩的功能ExpandListView就完全可以做到了,这次咱们不仅要实现伸展收缩功能,还得实现分组悬浮,同 ...

  2. RecyclerView悬浮标题

    效果图:        1.顶部会悬浮章的部分 2.第二章上滑会推挤第一章 3.第二章下拉会带出第一章 4.并不是所有时候都有悬浮部分(为什么这条标红,因为市面上几乎所有的悬浮都是必须存在且在顶部,害 ...

  3. android 水平方向瀑布流,Android RecyclerView(瀑布流)水平/垂直方向分割线

     Android RecyclerView(瀑布流)水平/垂直方向分割线 Android RecyclerView不像过去的ListView那样随意的设置水平方向的分割线,如果要实现Recycle ...

  4. Android RecyclerView 向上偏移解决、添加自定义分割线,瀑布流,ScrollView嵌套RecyclerView滑动卡顿

    向上偏移解决 android:focusableInTouchMode="true" android:focusable="true" android:fill ...

  5. android 仿qq好友动态,Android UI仿QQ好友列表分组悬浮效果

    本文实例为大家分享了Android UI仿QQ好友列表分组悬浮效果的具体代码,供大家参考,具体内容如下 楼主是在平板上測试的.图片略微有点大,大家看看效果就好 接下来贴源代码: PinnedHeade ...

  6. android RecyclerView一步步打造分组效果、类似QQ分组、折叠菜单、分组效果(一)

    第二篇文章链接: android RecyclerView一步步打造分组效果.类似QQ分组.折叠菜单.分组效果(二) 效果图: 前言 之前看到这种效果如果用recyclerview来实现没有一点思路, ...

  7. android RecyclerView一步步打造分组效果、类似QQ分组、折叠菜单、分组效果(二)

    第一篇链接: android RecyclerView一步步打造分组效果.类似QQ分组.折叠菜单.分组效果(一) 注!已更新代码! 上一篇写了分组效果的初步实现: 这一篇就继续增加分组折叠效果和基类的 ...

  8. Android RecyclerView 基本使用

    Android RecyclerView 基本使用 概述 RecyclerView出现已经有一段时间了,相信大家肯定不陌生了,大家可以通过导入support-v7对其进行使用. 据官方的介绍,该控件用 ...

  9. Android RecyclerView设计通用Adapter

    RecylerView 的使用频率现在也算做是很高了吧?使用起来的确是挺方便的,也容易实现一些比较好看的效果 一.一般步骤 一般的设计流程都是如下所示 首先是需要一个 JavaBean 来承载数据,包 ...

最新文章

  1. 2017年9月11日
  2. spring security之httpSecurity使用示例
  3. python迭代器生成器使用技巧(1):遍历、代理、生成器创建迭代、反向迭代
  4. springboot 前缀_SpringBoot配置文件的注入
  5. mariadb 最新精简压缩版 win64 解压即用
  6. [翻译]编写高性能 .NET 代码 第一章:性能测试与工具 -- 选择什么来衡量
  7. 如何在windows上将本地项目上传到Github
  8. 联络员(信息学奥赛一本通-T1393)
  9. 转自: http://blog.csdn.net/xiaxiaorui2003/article/details/3838631
  10. POJ 2115 C Looooops (扩展欧几里德解同余方程 Ax = B(mod C) )
  11. 原型和构造函数(1)
  12. JVM虚拟机之二 堆内存
  13. mysql 事务_详解mysql如何做事务
  14. 【转】Java中的static关键字解析
  15. python round用法_Python round 函数
  16. U盘写保护,不能被格式化
  17. 域名 空间 服务器 三者之间的关系
  18. linux docker 软路由,OpenWrt软路由使用docker安装jellyfin影音中心
  19. 天影字幕_天影字幕(GeniusCG) V 12.50 官方版
  20. Linux系统常见的发行版本以及区别!

热门文章

  1. Hive的UDF开发踩过的那些坑儿
  2. 转换为Json数据的几种方式
  3. 2021年N1叉车司机考试题及N1叉车司机新版试题
  4. 没有HOOK就没有病毒?详谈HOOK API技术(转)
  5. 【无标题】蓝桥杯java 给定n个十六进制正整数,输出它们对应的八进制数
  6. latex调行距_Overleaf 版本LaTeX初级(修改布局和行距)
  7. BJFU_2022Web前端开发_CSS样式汇总
  8. 我放弃天堂,去陕北放羊.
  9. Python中的三角函数总结
  10. Jmeter生成的jtl文件用命令转换成html报告