package Ġcom . lif ull . android . item decoration Ċ Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Rect Ċ import Ġandroid . view .* Ċ import Ġandroidx . annotation . Layout Res Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ Ċ /** Ċ Ġ* Ġ[ android x . recyclerview . widget . RecyclerView . Item Decoration ] Ċ Ġ* Ċ Ġ* Ġ@ param Ġres Id ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout ĠResource Id Ċ Ġ* Ġ@ param Ġtype ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Ġtype . Ġ[ Type . HEADER ] Ġor Ġ[ Type . FO OTER ] Ċ Ġ* Ġ@ param Ġrepeat ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue : Ġall Ġelement Ġsatisf ying Ġcondition , Ġfalse : Ġfirst Ġelement Ġsatisf ying Ġthe Ġcondition Ċ Ġ* Ġ@ param Ġcondition ĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrawing Ġcondition Ċ Ġ* Ġ@ param Ġon Bind Item Decoration Ġ Ġcallback Ġbind Ġitem Ġdecoration Ċ Ġ* Ġ@ author Ġin uk o Ċ Ġ*/ Ċ abstract Ġclass ĠAbstract Item Decoration ( ĊĠĠĠ Ġ@ Layout Res Ġprivate Ġval Ġres Id : ĠInt , ĊĠĠĠ Ġprivate Ġval Ġtype : ĠType Ġ= ĠType . HEADER , ĊĠĠĠ Ġprivate Ġval Ġrepeat : ĠBoolean ? Ġ= Ġfalse , ĊĠĠĠ Ġprivate Ġval Ġcondition : Ġ(( child : ĠView , Ġparent : ĠRecyclerView ) Ġ-> ĠBoolean )? Ġ= Ġnull , ĊĠĠĠ Ġprivate Ġval Ġon Bind Item Decoration : Ġ(( item View : ĠView , Ġchild : ĠView , Ġparent : ĠRecyclerView ) Ġ-> ĠUnit )? Ġ= Ġnull Ċ ) Ġ: ĠRecyclerView . Item Decoration () Ġ{ ĊĊĠĠĠ Ġ/** ĠitemView Ġ*/ ĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠitemView : ĠView ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ inheritDoc ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Draw ( c : ĠCanvas , Ġparent : ĠRecyclerView , Ġstate : ĠRecyclerView . State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcondition Ġ= Ġcondition Ġ?: Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType . HEADER Ġ-> Ġ:: is Header ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType . FO OTER Ġ-> Ġ:: is Footer ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdraw Item View ( c , Ġparent , Ġcondition ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ inheritDoc ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun ĠgetItem Offsets ( out Rect : ĠRect , Ġview : ĠView , Ġparent : ĠRecyclerView , Ġstate : ĠRecyclerView . State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġinitialize Ġof ĠitemView ĊĠĠĠĠĠĠĠ Ġinitialize Item View ( view , Ġparent ) ĊĠĠĠĠĠĠĠ Ġ// Ġcheck Ġthe Ġtype ĊĠĠĠĠĠĠĠ Ġval Ġcondition Ġ= Ġcondition Ġ?: Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType . HEADER Ġ-> Ġ:: is Header ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType . FO OTER Ġ-> Ġ:: is Footer ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġset Ġoffsets ĊĠĠĠĠĠĠĠ Ġif Ġ( condition ( view , Ġparent )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtop Ġ= Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType . HEADER Ġ-> ĠitemView . meas ured Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType . FO OTER Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbottom Ġ= Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType . HEADER Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType . FO OTER Ġ-> ĠitemView . meas ured Height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout Rect . set ( 0 , Ġtop , Ġ 0 , Ġbottom ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout Rect . set Empty () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInitialize Ġof Ġ[ item View ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġview Ġ[ View ] ĊĠĠĠĠ Ġ* Ġ@ param Ġparent Ġ[ RecyclerView ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġinitialize Item View ( ĊĠĠĠĠĠĠĠ Ġview : ĠView , ĊĠĠĠĠĠĠĠ Ġparent : ĠRecyclerView ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(:: item View . isInitialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġv : ĠView Ġ= ĠLayoutInflater . from ( parent . context ). inflate ( res Id , Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ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 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv . layout Params . height ) ĊĠĠĠĠĠĠĠ Ġv . measure ( child Width , Ġchild Height ) ĊĠĠĠĠĠĠĠ Ġv . layout ( 0 , Ġ 0 , Ġv . meas ured Width , Ġv . meas ured Height ) ĊĠĠĠĠĠĠĠ ĠitemView Ġ= Ġv ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDraw Ġ[ item View ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġc Ġ[ Canvas ] ĊĠĠĠĠ Ġ* Ġ@ param Ġparent Ġ[ RecyclerView ] ĊĠĠĠĠ Ġ* Ġ@ param Ġcondition ĠDraw ing Ġcondition ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġdraw Item View ( ĊĠĠĠĠĠĠĠ Ġc : ĠCanvas , ĊĠĠĠĠĠĠĠ Ġparent : ĠRecyclerView , ĊĠĠĠĠĠĠĠ Ġcondition : Ġ(( child : ĠView , Ġparent : ĠRecyclerView ) Ġ-> ĠBoolean ) ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġadapter Ġ= Ġparent . adapter Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġitem Count Ġ= Ġadapter . item Count ĊĠĠĠĠĠĠĠ Ġif Ġ( item Count Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġrepeat Ġ= Ġrepeat Ġ?: Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġchild Count Ġ= Ġparent . child Count Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. child Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġparent . getChild At ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( condition ( view , Ġparent )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Bind Item Decoration ?. invoke ( item View , Ġview , Ġparent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . save () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtop Ġ= Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType . HEADER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . top Ġ- ĠitemView . meas ured Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType . FO OTER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . top Ġ+ ĠitemView . meas ured Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . translate ( 0 f , Ġtop . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . draw ( c ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . restore () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( repeat . not ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCheck Ġa ĠHeader ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġchild Ġ[ View ] ĊĠĠĠĠ Ġ* Ġ@ param Ġparent Ġ[ RecyclerView ] ĊĠĠĠĠ Ġ* Ġ@ return ĠReturn Ġtrue Ġif Ġheader ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġis Header ( ĊĠĠĠĠĠĠĠ Ġchild : ĠView , ĊĠĠĠĠĠĠĠ Ġparent : ĠRecyclerView ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġparent . getChild Adapter Position ( child ) ĊĠĠĠĠĠĠĠ Ġval Ġadapter Ġ= Ġparent . adapter Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġitem Count Ġ= Ġadapter . item Count ĊĠĠĠĠĠĠĠ Ġif Ġ( item Count Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġposition Ġ== Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCheck Ġa ĠFooter ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġchild Ġ[ View ] ĊĠĠĠĠ Ġ* Ġ@ param Ġparent Ġ[ RecyclerView ] ĊĠĠĠĠ Ġ* Ġ@ return ĠReturn Ġtrue Ġif Ġfooter ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġis Footer ( ĊĠĠĠĠĠĠĠ Ġchild : ĠView , ĊĠĠĠĠĠĠĠ Ġparent : ĠRecyclerView ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġparent . getChild Adapter Position ( child ) ĊĠĠĠĠĠĠĠ Ġval Ġadapter Ġ= Ġparent . adapter Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġitem Count Ġ= Ġadapter . item Count ĊĠĠĠĠĠĠĠ Ġif Ġ( item Count Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġitem Count Ġ- Ġ 1 Ġ== Ġposition ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDraw Ġtype ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġenum Ġclass ĠType Ġconstructor ( val Ġtype : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠHEADER ( 1 ), ĊĠĠĠĠĠĠĠ ĠFO OTER ( 2 ); ĊĠĠĠ Ġ} Ċ }