本文中所有效果通过ItemDecoration实现,通过此实现的可以与业务解耦,让RecyclerView的模板更加简洁,不关心任何辅助性ui,github地址
一、顶部吸附效果图
二、顶部不吸附效果图
三、不满一屏效果
四、核心实现点
1、为什么通过ItemDecoration能够实现,原理?
①通过getItemOffsets()方法获取当前模板view的left、top、right、bottom边距,这些留出的间距用于绘制这些辅助性ui。
// RecyclerView的measure child方法 public void measureChild(@NonNull View child, int widthUsed, int heightUsed) { final LayoutParams lp = (LayoutParams) child.getLayoutParams(); //将getItemOffsets()获取的值累加到测量值之中 final Rect insets = mRecyclerView.getItemDecorInsetsForChild(child); widthUsed += insets.left + insets.right; heightUsed += insets.top + insets.bottom; final int widthSpec = getChildMeasureSpec(getWidth(), getWidthMode(), getPaddingLeft() + getPaddingRight() + widthUsed, lp.width, canScrollHorizontally()); final int heightSpec = getChildMeasureSpec(getHeight(), getHeightMode(), getPaddingTop() + getPaddingBottom() + heightUsed, lp.height, canScrollVertically()); if (shouldMeasureChild(child, widthSpec, heightSpec, lp)) { child.measure(widthSpec, heightSpec); } }
②通过onDrawOver()绘制悬浮视图,绘制的ui在所有子视图之上。
@Override public void draw(Canvas c) { super.draw(c); //在RecyclerView绘制完之后回调onDrawOver()方法 final int count = mItemDecorations.size(); for (int i = 0; i < count; i++) { mItemDecorations.get(i).onDrawOver(c, this, mState); } }
③通过onDraw()方法绘制分割线等视图。
public void onDraw(Canvas c) { super.onDraw(c); //先回调onDraw()方法,在绘制RecyclerView子view final int count = mItemDecorations.size(); for (int i = 0; i < count; i++) { mItemDecorations.get(i).onDraw(c, this, mState); } }
2、“到底提示” 的绘制
由于在getItemOffsets()获取不到子视图的宽高,此时还没有measure,在getItemOffsets()添加高度后,如果不满一屏需要在onDraw()方法中进行修正,修正方式为:
反射修改mDecorInsets属性,重置在getItemOffsets()方法中设置的值。
private void setDecorInsetsBottom(RecyclerView.LayoutParams param, int bottom) { try { // 找到RecyclerView.LayoutParams中的mDecorInsets属性值 Field filed = RecyclerView.LayoutParams.class.getDeclaredField("mDecorInsets"); filed.setAccessible(true); Rect decorRect = (Rect) filed.get(param); decorRect.bottom = bottom; } catch (Exception e) { } }
总结
以上所述是小编给大家介绍的Android RecyclerView实现悬浮吸顶、分隔线、到底提示效果,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对小牛知识库网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
本文向大家介绍Android实现顶部悬浮效果,包括了Android实现顶部悬浮效果的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Android实现顶部悬浮效果的具体代码,供大家参考,具体内容如下 效果图 布局 java 注意事项 1.清单文件需要配置 2.gradle配置需要24以上 3.recyclerView的下滑和swipRefreshLayout的下拉刷新会冲突,所以需要
本文向大家介绍jQuery简单实现页面元素置顶时悬浮效果示例,包括了jQuery简单实现页面元素置顶时悬浮效果示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了jQuery简单实现页面元素置顶时悬浮效果的方法。分享给大家供大家参考,具体如下: 一、JS Code: 二、Html Code: 更多关于jQuery相关内容感兴趣的读者可查看本站专题:《jQuery常用插件及用法总结》、《jQ
使用悬浮提示 java 编辑器中包含了不同类型的悬浮提示,悬浮提示提供了鼠标指针指向元素的额外信息。所有java编辑器中相关的悬浮提示可以通过 preference(首选项) 的 Hovers 页面来配置(搜索框中输入 "hover")。 java 编辑器中将鼠标指针移至类上,将显示与该类相关的java文档信息。 java 编辑器中将鼠标指针移至方法上,将显示与该方法相关的java文档信息。
本文向大家介绍Android实现qq列表式的分类悬浮提示,包括了Android实现qq列表式的分类悬浮提示的使用技巧和注意事项,需要的朋友参考一下 效果图: 这种效果的实现这里是采用自定义ExpandableListView,给它设置一个指示布局,在滑动过程中监听当前是否应该悬浮显示分类来实现的。今天抽时间,整理了下代码,记录一下使用过程,以便有类似的需求的时候可以快速搞定。 话不多说,我们直接看
本文向大家介绍使用css实现悬浮提示文本相关面试题,主要包含被问及使用css实现悬浮提示文本时的应答技巧和注意事项,需要的朋友参考一下
本文向大家介绍vue+jquery+lodash实现滑动时顶部悬浮固定效果,包括了vue+jquery+lodash实现滑动时顶部悬浮固定效果的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了vue实现滑动时顶部悬浮固定效果的具体代码,供大家参考,具体内容如下 这个效果是一个项目中抽出来的一个demo效果。 前期准备: 1. 引入jQ 引入lodash.js fixTop.vue组件的