package Ġcom . example . wan Android . widget . recycler Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . view . View Parent Ċ import Ġandroidx . annotation . Layout Res Ċ import Ġandroidx . recyclerview . widget . Grid LayoutManager Ċ import Ġandroidx . recyclerview . widget . Grid LayoutManager . Span Size Lookup Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ Ċ /** Ċ Ġ* Ġauthor Ġ: ĠAndroid Ġ è½® åŃĲ åĵ ¥ Ċ Ġ* Ċ Ġ* Ġgithub Ġ: Ġhttps :// github . com / getActivity / Android Project - Kotlin Ċ Ġ* Ċ Ġ* Ġtime Ġ: Ġ 2 0 1 9 / 0 9 / 2 1 Ċ Ġ* Ċ Ġ* Ġdesc Ġ: ĠæĶ¯æĮģ æ·»åĬł å¤´ éĥ¨ åĴĮ åºķ éĥ¨ çļĦ ĠRecyclerView Ċ Ġ*/ Ċ @ Suppress (" Notify DataSet Changed ", Ġ" Member Visibility Can Be Private ", Ġ" unused ") Ċ class ĠWrap RecyclerView Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠ Ġcontext : ĠContext , Ġattrs : ĠAttributeSet ? Ġ= Ġnull , Ġdef Style Attr : ĠInt Ġ= Ġ 0 Ċ ) Ġ: ĠRecyclerView ( context , Ġattrs , Ġdef Style Attr ) Ġ{ ĊĊĠĠĠ Ġ/** Ġ åİŁ æľīçļĦ éĢĤ éħį åĻ¨ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġreal Adapter : ĠAdapter < out ĠViewHolder >? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĠæĶ¯æĮģ æ·»åĬł å¤´ éĥ¨ åĴĮ åºķ éĥ¨ çļĦ éĢĤ éħį åĻ¨ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġwrap Adapter : ĠWrap Recycler Adapter Ġ= ĠWrap Recycler Adapter () ĊĊĠĠĠ Ġoverride Ġfun Ġset Adapter ( adapter : ĠAdapter < out ĠViewHolder > ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġreal Adapter Ġ= Ġadapter ĊĠĠĠĠĠĠĠ Ġ// Ġ åģ · æ¢ ģ æį¢ æŁ ± ĊĠĠĠĠĠĠĠ Ġwrap Adapter . set Real Adapter ( real Adapter ) ĊĠĠĠĠĠĠĠ Ġ// Ġ ç¦ģ çĶ¨ æĿ¡ çĽ® åĬ¨çĶ» ĊĠĠĠĠĠĠĠ Ġitem Animator Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġsuper . setAdapter ( wrap Adapter ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Adapter (): ĠAdapter < *> ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġreal Adapter ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġæ·»åĬł å¤´ éĥ¨ View Ġ*/ ĊĠĠĠ Ġfun Ġadd Header View ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwrap Adapter . add Header View ( view ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġfun Ġ< V Ġ: ĠView ?> Ġadd Header View (@ Layout Res Ġid : ĠInt ): ĠV Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġheader View : ĠView Ġ= ĠLayoutInflater . from ( context ). inflate ( id , Ġthis , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġadd Header View ( header View ) ĊĠĠĠĠĠĠĠ Ġreturn Ġheader View Ġas ĠV ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġ ç§»éĻ¤ å¤´ éĥ¨ View Ġ*/ ĊĠĠĠ Ġfun Ġremove Header View ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwrap Adapter . remove Header View ( view ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġæ·»åĬł åºķ éĥ¨ View Ġ*/ ĊĠĠĠ Ġfun Ġadd Footer View ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwrap Adapter . add Footer View ( view ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġfun Ġ< V Ġ: ĠView ?> Ġadd Footer View (@ Layout Res Ġid : ĠInt ): ĠV Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfooter View : ĠView Ġ= ĠLayoutInflater . from ( context ). inflate ( id , Ġthis , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġadd Footer View ( footer View ) ĊĠĠĠĠĠĠĠ Ġreturn Ġfooter View Ġas ĠV ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġ ç§»éĻ¤ åºķ éĥ¨ View Ġ*/ ĊĠĠĠ Ġfun Ġremove Footer View ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwrap Adapter . remove Footer View ( view ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġèİ·åıĸ å¤´ éĥ¨ View æĢ» æķ° Ġ*/ ĊĠĠĠ Ġfun Ġget Header Views Count (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwrap Adapter . getHeader Views Count () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġèİ·åıĸ åºķ éĥ¨ View æĢ» æķ° Ġ*/ ĊĠĠĠ Ġfun Ġget Footer Views Count (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwrap Adapter . get Footer Views Count () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġèİ·åıĸ å¤´ éĥ¨ View éĽĨåĲĪ Ġ*/ ĊĠĠĠ Ġfun Ġget Header Views (): ĠMutable List < View ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwrap Adapter . getHeader Views () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġèİ·åıĸ åºķ éĥ¨ View éĽĨåĲĪ Ġ*/ ĊĠĠĠ Ġfun Ġget Footer Views (): ĠMutable List < View ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwrap Adapter . get Footer Views () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġ åĪ·æĸ° å¤´ éĥ¨ åĴĮ åºķ éĥ¨ å¸ĥå±Ģ æīĢæľīçļĦ ĠView ĠçļĦ çĬ¶æĢģ Ġ*/ ĊĠĠĠ Ġfun Ġrefresh Header Footer Views () Ġ{ ĊĠĠĠĠĠĠĠ Ġwrap Adapter . notify DataSet Changed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġè®¾ç½® åľ¨ ĠGrid LayoutManager Ġæ¨¡ å¼ı ä¸ĭ å¤´ éĥ¨ åĴĮ å°¾ éĥ¨ éĥ½æĺ¯ çĭ¬ åįł ä¸Ģ è¡Į çļĦ æķĪæŀľ Ġ*/ ĊĠĠĠ Ġfun Ġadjust Span Size () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlayout Manager : ĠLayout Manager ? Ġ= Ġlayout Manager ĊĠĠĠĠĠĠĠ Ġif Ġ( layout Manager Ġ! is ĠGrid LayoutManager ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlayout Manager . span Size Lookup Ġ= Ġobject Ġ: ĠSpan Size Lookup () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Span Size ( position : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ((( position Ġ< Ġwrap Adapter . getHeader Views Count () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġposition Ġ>= Ġwrap Adapter . getHeader Views Count () Ġ+ Ġ( if Ġ( real Adapter Ġ== Ġnull ) Ġ 0 Ġelse Ġreal Adapter !!. item Count ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġlayout Manager . span Count Ġelse Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġ éĩĩçĶ¨ è£ħ é¥ ° è®¾è®¡ æ¨¡å¼ı ï¼Į å°Ĩ åİŁ æľīçļĦ éĢĤ éħį åĻ¨ åĮħ è£ħ èµ·æĿ¥ Ġ*/ ĊĠĠĠ Ġprivate Ġclass ĠWrap Recycler Adapter Ġ: ĠAdapter < ViewHolder ?> () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** Ġ å¤´ éĥ¨ æĿ¡ çĽ® ç±»åŀĭ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠHEADER _ VIEW _ TYPE : ĠInt Ġ= ĠInt . MIN _ VALUE Ġshr Ġ 1 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** Ġ åºķ éĥ¨ æĿ¡ çĽ® ç±»åŀĭ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠFO OTER _ VIEW _ TYPE : ĠInt Ġ= ĠInt . MAX _ VALUE Ġshr Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** Ġ åİŁ æľīçļĦ éĢĤ éħį åĻ¨ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġreal Adapter : ĠAdapter < ViewHolder >? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġ/** Ġ å¤´ éĥ¨ View éĽĨåĲĪ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġheader Views : ĠMutable List < View ?> Ġ= ĠArrayList () ĊĊĠĠĠĠĠĠĠ Ġ/** Ġ åºķ éĥ¨ View éĽĨåĲĪ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġfooter Views : ĠMutable List < View ?> Ġ= ĠArrayList () ĊĊĠĠĠĠĠĠĠ Ġ/** Ġå½ĵåīį è°ĥçĶ¨ çļĦ ä½įç½® Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġcurrent Position : ĠInt Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġ/** ĠRecyclerView å¯¹è±¡ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġre cyclerView : ĠRecyclerView ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġ/** Ġæķ°æį® è§Ĥ å¯Ł èĢħ å¯¹è±¡ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġobserver : ĠWrap Adapter Data Observer ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġfun Ġset Real Adapter ( adapter : ĠAdapter < out ĠViewHolder > ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( real Adapter Ġ=== Ġadapter ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( real Adapter Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( observer Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġä¸º åİŁ æľīçļĦ Recycler Adapter ç§»éĻ¤ æķ°æį® çĽĳåĲ¬ å¯¹è±¡ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreal Adapter !!. unregister Adapter Data Observer ( observer !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreal Adapter Ġ= Ġadapter Ġas ĠAdapter < ViewHolder >? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( real Adapter Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( observer Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserver Ġ= ĠWrap Adapter Data Observer ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġä¸º åİŁ æľīçļĦ Recycler Adapter æ·»åĬł æķ°æį® çĽĳåĲ¬ å¯¹è±¡ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreal Adapter ?. register Adapter Data Observer ( observer !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ éĢĤ éħį åĻ¨ ä¸įæĺ¯ ç¬¬ ä¸Ģæ¬¡ è¢« ç»ĳå®ļ åĪ° RecyclerView ä¸Ĭ éľĢè¦ģ åıĳéĢģ éĢļçŁ¥ ï¼Į åĽłä¸º ç¬¬ ä¸Ģæ¬¡ ç»ĳå®ļ ä¼ļ èĩªåĬ¨ éĢļçŁ¥ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( re cyclerView Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify DataSet Changed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetItem Count (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġitem Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( real Adapter Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Count Ġ= Ġreal Adapter !!. item Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget Header Views Count () Ġ+ Ġitem Count Ġ+ Ġget Footer Views Count () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetItem ViewType ( position : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Position Ġ= Ġposition ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġèİ·åıĸ å¤´ éĥ¨ å¸ĥå±Ģ çļĦ æĢ» æķ° ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheader Count : ĠInt Ġ= Ġget Header Views Count () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġèİ·åıĸ åİŁ æľī éĢĤ éħį åĻ¨ çļĦ æĢ» æķ° ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadapter Count : ĠInt Ġ= Ġif Ġ( real Adapter Ġ!= Ġnull ) Ġreal Adapter !!. item Count Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġèİ·åıĸ åľ¨ åİŁ æľī éĢĤ éħį åĻ¨ ä¸ĬçļĦ ä½įç½® ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadj Position : ĠInt Ġ= Ġposition Ġ- Ġheader Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( position Ġ< Ġheader Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠHEADER _ VIEW _ TYPE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( adj Position Ġ< Ġadapter Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġreal Adapter !!. getItem ViewType ( adj Position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFO OTER _ VIEW _ TYPE ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Position (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcurrent Position ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠViewHolder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( view Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHEADER _ VIEW _ TYPE Ġ-> Ġnew Wrap ViewHolder ( header Views [ getPosition ()] !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFO OTER _ VIEW _ TYPE Ġ-> Ġnew Wrap ViewHolder ( footer Views [ getPosition () Ġ- Ġget Header Views Count () Ġ- Ġ( if Ġ( real Adapter Ġ!= Ġnull ) Ġreal Adapter !!. item Count Ġelse Ġ 0 )] !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠitemView Type : ĠInt Ġ= Ġreal Adapter !!. getItem ViewType ( getPosition () Ġ- Ġget Header Views Count ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item ViewType Ġ== ĠHEADER _ VIEW _ TYPE Ġ|| ĠitemView Type Ġ== ĠFO OTER _ VIEW _ TYPE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Please Ġdo Ġnot Ġuse Ġthis Ġtype Ġas Ġitem Type ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreal Adapter !!. onCreate ViewHolder ( parent , ĠitemView Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠViewHolder , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( real Adapter Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( getItem ViewType ( position )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHEADER _ VIEW _ TYPE , ĠFO OTER _ VIEW _ TYPE Ġ-> Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreal Adapter !!. on Bind ViewHolder ( holder , Ġget Position () Ġ- Ġget Header Views Count ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġnew Wrap ViewHolder ( view : ĠView ): ĠWrap ViewHolder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent : ĠView Parent ? Ġ= Ġview . parent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parent Ġis ĠViewGroup ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIllegalStateException : ĠViewHolder Ġviews Ġmust Ġnot Ġbe Ġattached Ġwhen Ġcreated . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEnsure Ġthat Ġyou Ġare Ġnot Ġpassing Ġ' true ' Ġto Ġthe Ġattach To Root Ġparameter Ġof ĠLayoutInflater . inflate (... , Ġboolean Ġattach To Root ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent . remove View ( view ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠWrap ViewHolder ( view ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetItem Id ( position : ĠInt ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( real Adapter Ġ!= Ġnull ) Ġ&& Ġ( position Ġ> Ġget Header Views Count () Ġ- Ġ 1 ) Ġ&& Ġ( position Ġ< Ġget Header Views Count () Ġ+ Ġreal Adapter !!. item Count )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġreal Adapter !!. getItem Id ( position Ġ- Ġget Header Views Count ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper . getItem Id ( position ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Attached To RecyclerView ( re cyclerView : ĠRecyclerView ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . re cyclerView Ġ= Ġre cyclerView ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreal Adapter ?. on Attached To RecyclerView ( re cyclerView ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Detached From RecyclerView ( re cyclerView : ĠRecyclerView ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . re cyclerView Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreal Adapter ?. on Detached From RecyclerView ( re cyclerView ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon View Re cyc led ( holder : ĠViewHolder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( holder Ġis ĠWrap ViewHolder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ éĺ² æŃ¢ è¿Ļä¸ª ĠViewHolder Ġ è¢« ĠRecyclerView Ġæĭ ¿ åİ» å¤į çĶ¨ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . setIs Re cycl able ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreal Adapter ?. on View Re cyc led ( holder ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failed To Re cycle View ( holder : ĠViewHolder ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( real Adapter Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Failed To Re cycle View ( holder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġreal Adapter !!. on Failed To Re cycle View ( holder ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon View Attached To Window ( holder : ĠViewHolder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( real Adapter Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreal Adapter !!. on View Attached To Window ( holder ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon View Detached From Window ( holder : ĠViewHolder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreal Adapter ?. on View Detached From Window ( holder ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** Ġæ·»åĬł å¤´ éĥ¨ View Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġadd Header View ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ ä¸įèĥ½ æ·»åĬł åĲĮ ä¸Ģä¸ª View å¯¹è±¡ ï¼Į åĲ¦åĪĻ ä¼ļ å¯¼èĩ´ RecyclerView å¤į çĶ¨ å¼Ĥå¸¸ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! header Views . contains ( view ) Ġ&& Ġ! footer Views . contains ( view )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheader Views . add ( view ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify DataSet Changed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** Ġ ç§»éĻ¤ å¤´ éĥ¨ View Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġremove Header View ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( header Views . remove ( view )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify DataSet Changed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** Ġæ·»åĬł åºķ éĥ¨ View Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġadd Footer View ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ ä¸įèĥ½ æ·»åĬł åĲĮ ä¸Ģä¸ª View å¯¹è±¡ ï¼Į åĲ¦åĪĻ ä¼ļ å¯¼èĩ´ RecyclerView å¤į çĶ¨ å¼Ĥå¸¸ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! footer Views . contains ( view ) Ġ&& Ġ! header Views . contains ( view )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfooter Views . add ( view ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify DataSet Changed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** Ġ ç§»éĻ¤ åºķ éĥ¨ View Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġremove Footer View ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( footer Views . remove ( view )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify DataSet Changed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** Ġèİ·åıĸ å¤´ éĥ¨ View æĢ» æķ° Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġget Header Views Count (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġheader Views . size ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** Ġèİ·åıĸ åºķ éĥ¨ View æĢ» æķ° Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġget Footer Views Count (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfooter Views . size ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** Ġèİ·åıĸ å¤´ éĥ¨ View éĽĨåĲĪ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġget Header Views (): ĠMutable List < View ?> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġheader Views ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** Ġèİ·åıĸ åºķ éĥ¨ View éĽĨåĲĪ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġget Footer Views (): ĠMutable List < View ?> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfooter Views ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġ å¤´ éĥ¨ åĴĮ åºķ éĥ¨ éĢļ çĶ¨çļĦ ViewHolder å¯¹è±¡ Ġ*/ ĊĠĠĠ Ġprivate Ġclass ĠWrap ViewHolder Ġconstructor ( item View : ĠView ) Ġ: ĠViewHolder ( item View ) ĊĊĠĠĠ Ġ/** Ġæķ°æį® æĶ¹åıĺ çĽĳåĲ¬ åĻ¨ Ġ*/ ĊĠĠĠ Ġprivate Ġclass ĠWrap Adapter Data Observer Ġconstructor ( private Ġval Ġwrap Adapter : ĠWrap Recycler Adapter ) Ġ: ĠAdapter Data Observer () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonChanged () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrap Adapter . notify DataSet Changed () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Item Range Changed ( position Start : ĠInt , Ġitem Count : ĠInt , Ġpayload : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrap Adapter . notify Item Range Changed ( wrap Adapter . getHeader Views Count () Ġ+ Ġposition Start , Ġitem Count , Ġpayload ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Item Range Changed ( position Start : ĠInt , Ġitem Count : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrap Adapter . notify Item Range Changed ( wrap Adapter . getHeader Views Count () Ġ+ Ġposition Start , Ġitem Count ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Item Range Inserted ( position Start : ĠInt , Ġitem Count : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrap Adapter . notify Item Range Inserted ( wrap Adapter . getHeader Views Count () Ġ+ Ġposition Start , Ġitem Count ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Item Range Removed ( position Start : ĠInt , Ġitem Count : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrap Adapter . notify Item Range Removed ( wrap Adapter . getHeader Views Count () Ġ+ Ġposition Start , Ġitem Count ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Item Range Moved ( from Position : ĠInt , Ġto Position : ĠInt , Ġitem Count : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrap Adapter . notify Item Moved ( wrap Adapter . getHeader Views Count () Ġ+ Ġfrom Position , Ġwrap Adapter . getHeader Views Count () Ġ+ Ġto Position ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }