package Ġorg . vide ol an . v lc . gui . view Ċ Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Rect Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġorg . vide ol an . v lc . R Ċ import Ġorg . vide ol an . v lc . providers . med iali brary . Med iali brary Provider Ċ import Ġkotlin . math . max Ċ Ċ private Ġconst Ġval ĠTAG Ġ= Ġ" Recycler Section Item Decoration " Ċ Ċ class ĠRe cycler Section Item Decoration ( private Ġval Ġheader Offset : ĠInt , Ġprivate Ġval Ġsticky : ĠBoolean , Ġprivate Ġval Ġprovider : ĠMed iali brary Provider <* >) Ġ: ĠRecyclerView . Item Decoration () Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġheader View : ĠView ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġheader : ĠTextView ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem Offsets ( out Rect : ĠRect , Ġview : ĠView , Ġparent : ĠRecyclerView , Ġstate : ĠRecyclerView . State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . getItem Offsets ( out Rect , Ġview , Ġparent , Ġstate ) ĊĊĠĠĠĠĠĠĠ Ġval Ġpos Ġ= Ġparent . getChild Adapter Position ( view ) ĊĠĠĠĠĠĠĠ Ġif Ġ( provider . is First In Section ( pos )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout Rect . top Ġ= Ġheader Offset ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Draw Over ( c : ĠCanvas , Ġparent : ĠRecyclerView , Ġstate : ĠRecyclerView . State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Draw Over ( c , Ġparent , Ġstate ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! :: header View . isInitialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheader View Ġ= Ġinf late Header View ( parent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheader Ġ= Ġheader View . findViewById ( R . id . section _ header ) Ġas ĠTextView ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfix Layout Size ( header View , Ġparent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġ// draw Ġcurrent Ġheader ĊĠĠĠĠĠĠĠ Ġ// look Ġif Ġprevious Ġheader Ġhas Ġbeen Ġdrawn ĊĠĠĠĠĠĠĠ Ġvar Ġprevious Section Position Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġval Ġprevious Child Ġ= Ġparent . getChild At ( 0 ) ĊĠĠĠĠĠĠĠ Ġif Ġ( sticky Ġ&& Ġprevious Child Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġparent . getChild Adapter Position ( previous Child ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsection Position Ġ= Ġprovider . getPosition For Section ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( provider . getHeader For Post ion ( section Position ) Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Section Position Ġ= Ġsection Position ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= Ġprovider . get Section for Position ( section Position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheader . text Ġ= Ġtitle ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Header ( c , Ġparent . getChild At ( 0 ), Ġheader View ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdrawn Positions Ġ= ĠArrayList < Int >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġparent . child Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Ġ= Ġparent . getChild At ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġparent . getChild Adapter Position ( child ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( position Ġ== Ġprevious Section Position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// prevent Ġre - drawing Ġthe Ġprevious Ġdrawer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= Ġprovider . get Section for Position ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheader . text Ġ= Ġtitle ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( provider . is First In Section ( position )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Header ( c , Ġchild , Ġheader View ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrawn Positions . add ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw Header ( c : ĠCanvas , Ġchild : ĠView , Ġheader View : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġc . save () ĊĠĠĠĠĠĠĠ Ġif Ġ( sticky ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġc . translate ( 0 f , Ġmax ( 0 , Ġchild . top Ġ- Ġheader View . height ). toFloat ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġc . translate ( 0 f , Ġ( child . top Ġ- Ġheader View . height ). toFloat ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġheader View . draw ( c ) ĊĠĠĠĠĠĠĠ Ġc . restore () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinf late Header View ( parent : ĠRecyclerView ): ĠView Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠLayoutInflater . from ( parent . context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. inflate ( R . layout . recycler _ section _ header , Ġparent , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMe as ures Ġthe Ġheader Ġview Ġto Ġmake Ġsure Ġits Ġsize Ġis Ġgreater Ġthan Ġ 0 Ġand Ġwill Ġbe Ġdrawn ĊĠĠĠĠ Ġ* Ġhttps :// y oda . ente lect . co . za / view / 9 6 2 7 / how - to - android - recyclerview - item - decor ations ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġfix Layout Size ( view : ĠView , Ġparent : ĠViewGroup ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwidth Spec Ġ= ĠView . Measure Spec . make Measure Spec ( parent . width , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView . Measure Spec . EX ACT LY ) ĊĠĠĠĠĠĠĠ Ġval Ġheight Spec Ġ= ĠView . Measure Spec . make Measure Spec ( parent . height , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView . Measure Spec . UNSPECIFIED ) ĊĊĠĠĠĠĠĠĠ Ġval Ġchild Width Ġ= ĠViewGroup . getChild Measure Spec ( width Spec , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent . padding Left Ġ+ Ġparent . padding Right , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . layout Params . width ) ĊĠĠĠĠĠĠĠ Ġval Ġchild Height Ġ= ĠViewGroup . getChild Measure Spec ( height Spec , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent . padding Top Ġ+ Ġparent . padding Bottom , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . layout Params . height ) ĊĊĠĠĠĠĠĠĠ Ġview . measure ( child Width , Ġchild Height ) ĊĊĠĠĠĠĠĠĠ Ġview . layout ( 0 , Ġ 0 , Ġview . meas ured Width , Ġview . meas ured Height ) ĊĠĠĠ Ġ} Ċ Ċ }