Android--RecyclerView分组悬浮标题(分割线)
客官先看图:
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分组悬浮标题(分割线)相关推荐
- RecyclerView实现收缩分组悬浮列表
今天给大伙儿分享一个用RecyclerView实现收缩分组悬浮列表的功能.如果只是想实现分组收缩的功能ExpandListView就完全可以做到了,这次咱们不仅要实现伸展收缩功能,还得实现分组悬浮,同 ...
- RecyclerView悬浮标题
效果图: 1.顶部会悬浮章的部分 2.第二章上滑会推挤第一章 3.第二章下拉会带出第一章 4.并不是所有时候都有悬浮部分(为什么这条标红,因为市面上几乎所有的悬浮都是必须存在且在顶部,害 ...
- android 水平方向瀑布流,Android RecyclerView(瀑布流)水平/垂直方向分割线
Android RecyclerView(瀑布流)水平/垂直方向分割线 Android RecyclerView不像过去的ListView那样随意的设置水平方向的分割线,如果要实现Recycle ...
- Android RecyclerView 向上偏移解决、添加自定义分割线,瀑布流,ScrollView嵌套RecyclerView滑动卡顿
向上偏移解决 android:focusableInTouchMode="true" android:focusable="true" android:fill ...
- android 仿qq好友动态,Android UI仿QQ好友列表分组悬浮效果
本文实例为大家分享了Android UI仿QQ好友列表分组悬浮效果的具体代码,供大家参考,具体内容如下 楼主是在平板上測试的.图片略微有点大,大家看看效果就好 接下来贴源代码: PinnedHeade ...
- android RecyclerView一步步打造分组效果、类似QQ分组、折叠菜单、分组效果(一)
第二篇文章链接: android RecyclerView一步步打造分组效果.类似QQ分组.折叠菜单.分组效果(二) 效果图: 前言 之前看到这种效果如果用recyclerview来实现没有一点思路, ...
- android RecyclerView一步步打造分组效果、类似QQ分组、折叠菜单、分组效果(二)
第一篇链接: android RecyclerView一步步打造分组效果.类似QQ分组.折叠菜单.分组效果(一) 注!已更新代码! 上一篇写了分组效果的初步实现: 这一篇就继续增加分组折叠效果和基类的 ...
- Android RecyclerView 基本使用
Android RecyclerView 基本使用 概述 RecyclerView出现已经有一段时间了,相信大家肯定不陌生了,大家可以通过导入support-v7对其进行使用. 据官方的介绍,该控件用 ...
- Android RecyclerView设计通用Adapter
RecylerView 的使用频率现在也算做是很高了吧?使用起来的确是挺方便的,也容易实现一些比较好看的效果 一.一般步骤 一般的设计流程都是如下所示 首先是需要一个 JavaBean 来承载数据,包 ...
最新文章
- 2017年9月11日
- spring security之httpSecurity使用示例
- python迭代器生成器使用技巧(1):遍历、代理、生成器创建迭代、反向迭代
- springboot 前缀_SpringBoot配置文件的注入
- mariadb 最新精简压缩版 win64 解压即用
- [翻译]编写高性能 .NET 代码 第一章:性能测试与工具 -- 选择什么来衡量
- 如何在windows上将本地项目上传到Github
- 联络员(信息学奥赛一本通-T1393)
- 转自: http://blog.csdn.net/xiaxiaorui2003/article/details/3838631
- POJ 2115 C Looooops (扩展欧几里德解同余方程 Ax = B(mod C) )
- 原型和构造函数(1)
- JVM虚拟机之二 堆内存
- mysql 事务_详解mysql如何做事务
- 【转】Java中的static关键字解析
- python round用法_Python round 函数
- U盘写保护,不能被格式化
- 域名 空间 服务器 三者之间的关系
- linux docker 软路由,OpenWrt软路由使用docker安装jellyfin影音中心
- 天影字幕_天影字幕(GeniusCG) V 12.50 官方版
- Linux系统常见的发行版本以及区别!