package Ġcom . tz t . customize kt . di y . recycler Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . graphics . Paint Ċ import Ġandroid . graphics . Rect Ċ import Ġandroid . text . Text Paint Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . tz t . customize kt . Display Helper ĊĊ Ċ abstract Ġclass ĠSt ic ke Item Decoration ( ĊĠĠĠ Ġval Ġcontext : ĠContext Ċ ) Ġ: ĠRecyclerView . Item Decoration () Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġheader Height Ġ= ĠDisplay Helper . dp 2 px ( 4 0 F ) ĊĊĠĠĠ Ġprivate Ġvar Ġis GridLayout Ġ= Ġfalse ĊĊĊĠĠĠ Ġprivate Ġval Ġhead Paint Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠPaint (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . is Anti Alias Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . color Ġ= ĠColor . parse Color ("# E 4 E 4 E 4 ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġtext Paint Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠText Paint (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . is Anti Alias Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . text Size Ġ= ĠDisplay Helper . sp 2 px ( 1 6 F ). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . color Ġ= ĠColor . parse Color ("# 8 0 0 0 0 0 0 0 ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġas GridLayout (): ĠSt ic ke Item Decoration Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . is GridLayout Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Header Height ( height : ĠInt ): ĠSt ic ke Item Decoration Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . header Height Ġ= Ġheight ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Header Color ( color : ĠInt ): ĠSt ic ke Item Decoration Ġ{ ĊĠĠĠĠĠĠĠ Ġhead Paint . color Ġ= Ġcolor ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Header Title Color ( color : ĠInt ): ĠSt ic ke Item Decoration Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . text Paint . color Ġ= Ġcolor ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Draw Over ( c : ĠCanvas , Ġparent : ĠRecyclerView , Ġstate : ĠRecyclerView . State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Draw Over ( c , Ġparent , Ġstate ) ĊĊĠĠĠĠĠĠĠ Ġval Ġleft Ġ= Ġif Ġ(! is GridLayout ) Ġparent . padding Left Ġelse Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġright Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is GridLayout ) Ġparent . width Ġ- Ġparent . padding Right Ġelse ĠDisplay Helper . screen Width () ĊĊĠĠĠĠĠĠĠ Ġval Ġchild Count Ġ= Ġparent . child Count ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġchild Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Ġ= Ġparent . getChild At ( i ) Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadapter Position Ġ= Ġparent . getChild Adapter Position ( child ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" St ic ke Item Decoration ", Ġ" is Stick Head [ ${ is Stick Head ( adapter Position )} ]") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Stick Head ( adapter Position )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtop Ġ= Ġchild . top Ġ- Ġheader Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbottom Ġ= Ġchild . top ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Stick Head ( c , Ġadapter Position , Ġleft , Ġtop , Ġright , Ġbottom ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// å½ĵ ĠItem View Ġæĺ¯ å±ı å¹ķ ä¸Ĭ ç¬¬ä¸Ģä¸ª åı¯ è§ģ çļĦ View ĠæĹ¶ ï¼Į ä¸į ç®¡ å®ĥ æĺ¯ ä¸įæĺ¯ ç»Ħ åĨħ ç¬¬ä¸Ģä¸ª View ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// å®ĥ éĥ½ éľĢè¦ģ ç»ĺ åĪ¶ å®ĥ å¯¹åºĶçļĦ ĠSt icky Header ãĢĤ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtop Ġ= Ġparent . padding Top ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Last Head ( adapter Position )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsuggest Top Ġ= Ġchild . bottom Ġ- Ġheader Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġå½ĵ ĠItem View Ġ ä¸İ ĠHeader Ġ åºķ éĥ¨ å¹³ é½Ĳ çļĦæĹ¶åĢĻ ï¼Į åĪ¤æĸŃ ĠHeader ĠçļĦ é¡¶ éĥ¨ æĺ¯åĲ¦ å°ı äºİ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġparent Ġ é¡¶ éĥ¨ åĨħå®¹ å¼Ģå§ĭ çļĦ ä½įç½® ï¼Į å¦Ĥæŀľ å°ı äºİ åĪĻ å¯¹ ĠHeader . top Ġ è¿Ľè¡Į ä½įç½® æĽ´æĸ° ï¼Į ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// åĲ¦åĪĻ å°Ĩ ç»§ç»Ń ä¿ĿæĮģ åĲ ¸ éĻĦ åľ¨ Ġparent ĠçļĦ é¡¶ éĥ¨ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( suggest Top Ġ< Ġtop ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Ġ= Ġsuggest Top ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbottom Ġ= Ġtop Ġ+ Ġheader Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Stick Head ( c , Ġadapter Position , Ġleft , Ġtop , Ġright , Ġbottom ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw Stick Head ( ĊĠĠĠĠĠĠĠ Ġcanvas : ĠCanvas , ĊĠĠĠĠĠĠĠ Ġposition : ĠInt , ĊĠĠĠĠĠĠĠ Ġleft : ĠInt , ĊĠĠĠĠĠĠĠ Ġtop : ĠInt , ĊĠĠĠĠĠĠĠ Ġright : ĠInt , ĊĠĠĠĠĠĠĠ Ġbottom : ĠInt ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrect Ġ= ĠRect ( left , Ġtop , Ġright , Ġbottom ) ĊĠĠĠĠĠĠĠ Ġcanvas . draw Rect ( left . toFloat (), Ġtop . toFloat (), Ġright . toFloat (), Ġbottom . toFloat (), Ġhead Paint ) ĊĊĊĠĠĠĠĠĠĠ Ġval Ġfont Metrics Ġ= Ġtext Paint . font Metrics ĊĠĠĠĠĠĠĠ Ġval Ġdistance Ġ= Ġ( font Metrics . bottom Ġ- Ġfont Metrics . top ) Ġ/ Ġ 2 Ġ- Ġfont Metrics . bottom ; ĊĠĠĠĠĠĠĠ Ġval Ġbase Line Ġ= Ġrect . center Y () Ġ+ Ġdistance ĊĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= Ġget Stick Head Title ( position ) ĊĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġtext Paint . measure Text ( title ) ĊĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġrect . center X () Ġ- Ġwidth Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġbottom Ġ- Ġfont Metrics . desc ent ĊĠĠĠĠĠĠĠ Ġcanvas . draw Text ( title , Ġx , Ġbase Line , Ġtext Paint ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem Offsets ( ĊĠĠĠĠĠĠĠ Ġout Rect : ĠRect , ĊĠĠĠĠĠĠĠ Ġview : ĠView , ĊĠĠĠĠĠĠĠ Ġparent : ĠRecyclerView , ĊĠĠĠĠĠĠĠ Ġstate : ĠRecyclerView . State ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . getItem Offsets ( out Rect , Ġview , Ġparent , Ġstate ) ĊĠĠĠĠĠĠĠ Ġif Ġ( parent . child Count Ġ== Ġ 0 ) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġchild Adapter Position Ġ= Ġparent . getChild Adapter Position ( view ) ĊĠĠĠĠĠĠĠ Ġif Ġ( is Stick Head ( child Adapter Position ) Ġ|| Ġ( child Adapter Position Ġ- Ġ 1 Ġ>= Ġ 0 Ġ&& Ġis Stick Head (( child Adapter Position Ġ- Ġ 1 ))) Ġ|| Ġ( child Adapter Position Ġ- Ġ 2 Ġ>= Ġ 0 Ġ&& Ġis Stick Head Ġ( child Adapter Position Ġ- Ġ 2 )) Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout Rect . top Ġ= Ġheader Height ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! is GridLayout ) Ġout Rect . top Ġ= Ġ 1 ĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġabstract Ġfun Ġis Stick Head ( position : ĠInt ): ĠBoolean ĊĠĠĠ Ġabstract Ġfun Ġget Stick Head Title ( position : ĠInt ): ĠString ĊĠĠĠ Ġabstract Ġfun Ġis Last Head ( position : ĠInt ): ĠBoolean Ċ Ċ }