package Ġcom . ste ven . movie app . widget . refresh Load Ċ Ċ import Ġandroid . util . Sparse Array Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . recyclerview . widget . Grid LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġandroidx . recyclerview . widget . St agger ed Grid LayoutManager Ċ Ċ /** Ċ Ġ* ĠDescription : Ċ Ġ* ĠData ï¼ļ 2 0 1 9 / 2 / 2 0 Ċ Ġ* ĠActor : St even Ċ Ġ*/ Ċ Ċ class ĠWrap Recycler Adapter ( private Ġval Ġadapter : ĠRecyclerView . Adapter < RecyclerView . ViewHolder >) Ġ: ĊĠĠĠ ĠRecyclerView . Adapter < RecyclerView . ViewHolder >() Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġm Header Views : ĠSparse Array < View > Ġ= ĠSparse Array () ĊĊĠĠĠ Ġprivate Ġval Ġm Footer Views : ĠSparse Array < View > Ġ= ĠSparse Array () ĊĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar ĠBASE _ ITEM _ TYPE _ HEADER : ĠInt Ġ= Ġ 1 0 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġvar ĠBASE _ ITEM _ TYPE _ FO OTER : ĠInt Ġ= Ġ 2 0 0 ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠRecyclerView . ViewHolder Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Header ViewType ( view Type )) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheader View Ġ= Ġm Header Views . get ( view Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcreate Header Footer ViewHolder ( header View ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( is Footer ViewType ( view Type )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfooter View Ġ= Ġm Footer Views . get ( view Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcreate Header Footer ViewHolder ( footer View ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġadapter . onCreate ViewHolder ( parent , Ġview Type ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun ĠgetItem Count (): ĠInt Ġ= Ġadapter . item Count Ġ+ Ġm Header Views . size () Ġ+ Ġm Footer Views . size () ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠRecyclerView . ViewHolder , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Header Position ( position ) Ġ|| Ġis Footer Position ( position )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġadapter Position Ġ= Ġposition Ġ- Ġm Header Views . size () ĊĠĠĠĠĠĠĠ Ġadapter . on Bind ViewHolder ( holder , Ġadapter Position ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem ViewType ( position : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Header Position ( position )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġm Header Views . key At ( position ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( is Footer Position ( position )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġposition Ġ- Ġm Header Views . size () Ġ- Ġadapter . item Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġm Footer Views . key At ( index ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġposition Ġ- Ġm Header Views . size () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġadapter . getItem ViewType ( index ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Header Footer ViewHolder ( view : ĠView ): ĠRecyclerView . ViewHolder Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠRecyclerView . ViewHolder ( view ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Header ViewType ( view Type : ĠInt ): ĠBoolean Ġ= Ġm Header Views . indexOf Key ( view Type ) Ġ>= Ġ 0 ĊĊĠĠĠ Ġprivate Ġfun Ġis Footer ViewType ( view Type : ĠInt ): ĠBoolean Ġ= Ġm Footer Views . indexOf Key ( view Type ) Ġ>= Ġ 0 ĊĊĠĠĠ Ġprivate Ġfun Ġis Header Position ( position : ĠInt ): ĠBoolean Ġ= Ġposition Ġ< Ġm Header Views . size () ĊĊĠĠĠ Ġprivate Ġfun Ġis Footer Position ( position : ĠInt ): ĠBoolean Ġ= Ġposition Ġ>= Ġm Header Views . size () Ġ+ Ġadapter . item Count ĊĊĊĠĠĠ Ġfun Ġadd Header View ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġm Header Views . indexOf Value ( view ) ĊĠĠĠĠĠĠĠ Ġif Ġ( position Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Header Views . put ( BASE _ ITEM _ TYPE _ HEADER ++, Ġview ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġnotify DataSet Changed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Footer View ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġm Footer Views . indexOf Value ( view ) ĊĠĠĠĠĠĠĠ Ġif Ġ( position Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Footer Views . put ( BASE _ ITEM _ TYPE _ FO OTER ++, Ġview ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġnotify DataSet Changed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Header View ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġm Header Views . indexOf Value ( view ) ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Header Views . remove At ( index ) ĊĠĠĠĠĠĠĠ Ġnotify DataSet Changed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Footer View ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġm Footer Views . indexOf Value ( view ) ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Footer Views . remove At ( index ) ĊĠĠĠĠĠĠĠ Ġnotify DataSet Changed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è§£åĨ³ Grid LayoutManager Ġheader åĴĮ footer æĺ¾ç¤º æķ´ è¡Į ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadjust Span Size ( re cyclerView : ĠRecyclerView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( re cyclerView . layout Manager Ġis ĠGrid LayoutManager ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlayout Manager Ġ= Ġre cyclerView . layout Manager Ġas ĠGrid LayoutManager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager . span Size Lookup Ġ= Ġobject Ġ: ĠGrid LayoutManager . Span Size Lookup () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Span Size ( position : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Header Or Footer : ĠBoolean Ġ= Ġis Header Position ( position ) Ġ|| Ġis Footer Position ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( is Header Or Footer ) Ġlayout Manager . span Count Ġelse Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġå½ĵ RecyclerView åľ¨ windows æ´»åĬ¨ æĹ¶ èİ·åıĸ St agger ed Grid LayoutManager å¸ĥå±Ģ ç®¡çĲĨ åĻ¨ ï¼Į ä¿®æŃ£ header åĴĮ footer æĺ¾ç¤º æķ´ è¡Į ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon View Attached To Window ( holder : ĠRecyclerView . ViewHolder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Attached To Window ( holder ) ĊĠĠĠĠĠĠĠ Ġval Ġlayout Params Ġ= Ġholder . item View . layout Params ĊĠĠĠĠĠĠĠ Ġif Ġ( layout Params Ġis ĠSt agger ed Grid LayoutManager . LayoutParams ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Header Position ( holder . layout Position ) Ġ|| Ġis Footer Position ( holder . layout Position )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Params . is Full Span Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ Ċ }