本文中所有效果通过ItemDecoration实现,通过此实现的可以与业务解耦,让RecyclerView的模板更加简洁,不关心任何辅助性ui, github地址
一、顶部吸附效果图
二、顶部不吸附效果图
三,不满一屏效果
四、核心实现点
1,为什么通过ItemDecoration能够实现,原理?
①通过getItemOffsets()方法获取当前模板视图的左,上,右,底部边距,这些留出的间距用于绘制这些辅助性ui。
//RecyclerView的衡量孩子的方法 公共空间measureChild (@NonNull视图的孩子,int widthUsed, int heightUsed) { 最后LayoutParams lp=(LayoutParams) child.getLayoutParams ();//将getItemOffsets()获取的值累加到测量值之中 最后一个矩形insets=mRecyclerView.getItemDecorInsetsForChild(孩子); widthUsed +=insets。左+ insets.right; heightUsed +=insets。前+ insets.bottom; 最后一个int widthSpec=getChildMeasureSpec (getWidth (), getWidthMode (), getPaddingLeft getPaddingRight () + () + widthUsed lp.width, canScrollHorizontally ()); 最后一个int heightSpec=getChildMeasureSpec(获得(),getHeightMode (), getPaddingTop getPaddingBottom () + () + heightUsed lp.height, canScrollVertically ()); 如果(shouldMeasureChild(孩子,widthSpec heightSpec, lp)) { 的孩子。测量(widthSpec heightSpec); } }
②通过onDrawOver()绘制悬浮视图,绘制的ui在所有子视图之上。
@Override 公共空间画(帆布c) { super.draw (c);//在RecyclerView绘制完之后回调onDrawOver()方法 最后一个int数=mItemDecorations.size (); for (int i=0;我& lt;计数;我+ +){ mItemDecorations.get(我)。onDrawOver (c, mState); } }
③通过onDraw()方法绘制分割线等视图。
公共空间> 私人空间setDecorInsetsBottom (RecyclerView。LayoutParams param, int底部){ 尝试{//找到RecyclerView.LayoutParams中的mDecorInsets属性值 现场提交=RecyclerView.LayoutParams.class.getDeclaredField (“mDecorInsets”); filed.setAccessible(真正的); 矩形decorRect=(矩形)filed.get(参数); decorRect。底=底部; }捕捉(异常e) { } }
以上所述是小编给大家介绍的Android RecyclerView实现悬浮吸顶,分隔线,到底提示效果,希望对大家有所帮助,如果大家有任何疑问请给我留的言,小编会及时回复大家的。在此也非常感谢大家对网站的支持。
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!