Android RecyclerView实现悬浮吸顶、分隔线、到底提示效果
本文中所有效果通过ItemDecoration实现,通过此实现的可以与业务解耦,让RecyclerView的模板更加简洁,不关心任何辅助性ui,github地址
一、顶部吸附效果图
二、顶部不吸附效果图
三、不满一屏效果
四、核心实现点
1、为什么通过ItemDecoration能够实现,原理?
①通过getItemOffsets()方法获取当前模板view的left、top、right、bottom边距,这些留出的间距用于绘制这些辅助性ui。
//RecyclerView的measurechild方法 publicvoidmeasureChild(@NonNullViewchild,intwidthUsed,intheightUsed){ finalLayoutParamslp=(LayoutParams)child.getLayoutParams(); //将getItemOffsets()获取的值累加到测量值之中 finalRectinsets=mRecyclerView.getItemDecorInsetsForChild(child); widthUsed+=insets.left+insets.right; heightUsed+=insets.top+insets.bottom; finalintwidthSpec=getChildMeasureSpec(getWidth(),getWidthMode(), getPaddingLeft()+getPaddingRight()+widthUsed,lp.width, canScrollHorizontally()); finalintheightSpec=getChildMeasureSpec(getHeight(),getHeightMode(), getPaddingTop()+getPaddingBottom()+heightUsed,lp.height, canScrollVertically()); if(shouldMeasureChild(child,widthSpec,heightSpec,lp)){ child.measure(widthSpec,heightSpec); } }
②通过onDrawOver()绘制悬浮视图,绘制的ui在所有子视图之上。
@Override publicvoiddraw(Canvasc){ super.draw(c); //在RecyclerView绘制完之后回调onDrawOver()方法 finalintcount=mItemDecorations.size(); for(inti=0;i③通过onDraw()方法绘制分割线等视图。
publicvoidonDraw(Canvasc){ super.onDraw(c); //先回调onDraw()方法,在绘制RecyclerView子view finalintcount=mItemDecorations.size(); for(inti=0;i2、“到底提示”的绘制
由于在getItemOffsets()获取不到子视图的宽高,此时还没有measure,在getItemOffsets()添加高度后,如果不满一屏需要在onDraw()方法中进行修正,修正方式为:
反射修改mDecorInsets属性,重置在getItemOffsets()方法中设置的值。privatevoidsetDecorInsetsBottom(RecyclerView.LayoutParamsparam,intbottom){ try{ //找到RecyclerView.LayoutParams中的mDecorInsets属性值 Fieldfiled=RecyclerView.LayoutParams.class.getDeclaredField("mDecorInsets"); filed.setAccessible(true); RectdecorRect=(Rect)filed.get(param); decorRect.bottom=bottom; }catch(Exceptione){ } }总结
以上所述是小编给大家介绍的AndroidRecyclerView实现悬浮吸顶、分隔线、到底提示效果,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。