package Ġcom . ql k . core . adapter . delegate Ċ Ċ import Ġandroid . support . annotation . MainThread Ċ import Ġandroid . support . v 7 . widget . RecyclerView Ċ import Ġcom . ql k . core . adapter . delegate . data . I Expand Data Delegate Ċ import Ġcom . ql k . core . adapter . delegate . data . I Flat Data Delegate Ċ import Ġcom . ql k . core . adapter . delegate . data . On Data Delegate Changed Listener Ċ import Ġcom . ql k . core . isIn Debug Mode Ċ Ċ /** Ċ Ġ* ĠQQ : 1 0 5 5 3 2 9 8 1 2 Ċ Ġ* ĠCreated Ġby ĠQ i Li King Ġon Ġ 2 0 1 9 - 0 7 - 1 6 . Ċ Ġ*/ Ċ /** Ċ Ġ* ĠControl Ġthe Ġadapter 's Ġexpand Ġ& Ġcollapse Ġevent < br /> Ċ Ġ* Ċ Ġ* ĠAll ĠNot - Query Ġmethods Ġshould Ġbe Ġcalled Ġon ĠMain ĠThread ! Ċ Ġ*/ Ċ interface ĠOn Expand Collapse Delegate Changed Listener < T > Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIf Ġyou Ġwant Ġclose Ġall Ġexpand Ġgroups Ġif Ġdelegate Ġchanged , Ġsee Ġset Max Expand Group Count ( max Count ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġon Expand Collapse Delegate Changed ( new Delegate : ĠI Expand Collapse Delegate < T > ?) Ċ } Ċ Ċ /** Ċ Ġ* ĠNeeds : ĠData Delegate Ċ Ġ*/ Ċ interface ĠI Expand Collapse Delegate < T > Ġ: ĠOn Data Delegate Changed Listener < T > Ġ{ ĊĊĠĠĠ Ġfun Ġset Max Expand Group Count ( max Count : ĠInt ) ĊĊĠĠĠ Ġfun Ġadd Expanded Groups ( groups : ĠList < T >) ĊĊĠĠĠ Ġfun Ġget Expanded Groups (): ĠList < T > ĊĊĠĠĠ Ġfun Ġis Group Expanded ( item : ĠT ): ĠBoolean ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return Ġis Expanded Ġafter Ġtoggle ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ MainThread ĊĠĠĠ Ġfun Ġtoggle Group ( item : ĠT ): ĠBoolean ĊĊĠĠĠ Ġ@ MainThread ĊĠĠĠ Ġfun Ġexpand Group ( item : ĠT ) ĊĊĠĠĠ Ġ@ MainThread ĊĠĠĠ Ġfun Ġcollapse Group ( item : ĠT ) ĊĊĠĠĠ Ġ@ MainThread ĊĠĠĠ Ġfun Ġcollapse All Expand Groups () Ġ{ ĊĠĠĠĠĠĠĠ Ġget Expanded Groups (). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġyour Ġimplementation Ġreturns Ġan Ġsnapshot Ġlist , Ġsynchronized Ġun ne cess arily ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠforEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollapse Group ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġclass ĠExpand Collapse Delegate Impl < T >( ĊĠĠĠ Ġprivate Ġval Ġadapter : ĠRecyclerView . Adapter < *> Ċ ) Ġ: ĠI Expand Collapse Delegate < T > Ġ{ ĊĠĠĠ Ġprivate Ġval Ġexpanded Groups Ġby Ġlazy Ġ{ ĠLinked HashSet < T >() Ġ} ĊĊĠĠĠ Ġprivate Ġvar ĠmaxSize Ġ= ĠNOT _ LIMIT ĊĠĠĠ Ġprivate Ġval Ġallow Expand : ĠBoolean Ġget () Ġ= ĠmaxSize Ġ== ĠNOT _ LIMIT Ġ|| ĠmaxSize Ġ> Ġ 0 ĊĊĠĠĠ Ġprivate Ġvar Ġexpand Data Delegate : ĠI Expand Data Delegate < T >? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġon Data Delegate Changed ( new Delegate : ĠI Flat Data Delegate < T > ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( expand Data Delegate Ġ== Ġnew Delegate Ġ|| Ġnew Delegate Ġ! is ĠI Expand Data Delegate ) Ġreturn ĊĠĠĠĠĠĠĠ Ġexpand Data Delegate Ġ= Ġnew Delegate ĊĠĠĠĠĠĠĠ Ġexpanded Groups . removeAll Ġ{ Ġ! new Delegate . is Item Exist ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Max Expand Group Count ( max Count : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠmaxSize Ġ= Ġmax Count ĊĠĠĠĠĠĠĠ Ġcheck Expanded Groups () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd Expanded Groups ( groups : ĠList < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġexpanded Groups . addAll ( groups ) ĊĠĠĠĠĠĠĠ Ġcheck Expanded Groups () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Expanded Groups (): ĠList < T > Ġ= Ġexpanded Groups . toList () ĊĊĠĠĠ Ġoverride Ġfun Ġis Group Expanded ( item : ĠT ) Ġ= Ġexpanded Groups . contains ( item ) ĊĊĠĠĠ Ġ@ MainThread ĊĠĠĠ Ġoverride Ġfun Ġtoggle Group ( item : ĠT ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Group Expanded ( item )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcollapse Group ( item ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpand Group ( item ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġis Group Expanded ( item ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ MainThread ĊĠĠĠ Ġoverride Ġfun Ġexpand Group ( item : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( expand Group Internal ( item )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpanded Groups . add ( item ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ MainThread ĊĠĠĠ Ġoverride Ġfun Ġcollapse Group ( item : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( collapse Group Internal ( item )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpanded Groups . remove ( item ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexpand Group Internal ( item : ĠT ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( allow Expand ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Group Expanded ( item )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove Expand Group To Front ( item ) ĠĠĠ Ġ// avoid Ġto Ġbe Ġre cyc led Ġby Ġcheck Expand Groups () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Delegate Ġ= Ġexpand Data Delegate Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgroup Position Ġ= Ġdata Delegate . getGroup Item Position ( item ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( group Position Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Count Ġ= Ġdata Delegate . getChild ItemCount ( group Position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child Count Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadapter Position Ġ= Ġdata Delegate . get Adapter Position ( item ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( adapter Position Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . notify Item Range Inserted ( adapter Position Ġ+ Ġ 1 , Ġchild Count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcollapse Group Internal ( item : ĠT ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Delegate Ġ= Ġexpand Data Delegate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġtrue ĠĠĠ Ġ// true : Ġremove Ġitem Ġfrom Ġexpand Groups Ġto Ġimprove Ġnext Ġcheck Expand Groups () Ġperformance ĊĠĠĠĠĠĠĠ Ġif Ġ( is Group Expanded ( item )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgroup Position Ġ= Ġdata Delegate . getGroup Item Position ( item ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( group Position Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Count Ġ= Ġdata Delegate . getChild ItemCount ( group Position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child Count Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadapter Position Ġ= Ġdata Delegate . get Adapter Position ( item ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( adapter Position Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġyou Ġwant Ġremove Ġits Ġgroup Ġsimultaneously , Ġm mm ... Ġhow Ġto Ġdo ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . notify Item Range Removed ( adapter Position Ġ+ Ġ 1 Ġ/* Ġexclude Ġits Ġgroup Ġitem Ġ*/, Ġchild Count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmove Expand Group To Front ( item : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġexpanded Groups . remove ( item ) ĊĠĠĠĠĠĠĠ Ġexpanded Groups . add ( item ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Expanded Groups () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( allow Expand ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( maxSize Ġ!= ĠNOT _ LIMIT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoverflow Ġ= Ġexpanded Groups . size Ġ- ĠmaxSize ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( overflow Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġiterator Ġ= Ġexpanded Groups . iterator () ĠĠĠ Ġ// Can Ġit Ġexecute Ġin ĠFIFO Ġmode ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( overflow ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( collapse Group Internal ( iterator . next ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiterator . remove () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// internal Ġmethod Ġmaybe Ġchange Ġthe Ġlist Ġitems ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpanded Groups . toList (). forEach Ġ{ Ġexpand Group Internal ( it ) Ġ} Ġ Ġ// check ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpanded Groups . toList (). forEach Ġ{ Ġcollapse Group Internal ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpanded Groups . clear () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( isIn Debug Mode ) Ġprintln (" Expand Collapse Delegate # add Expanded Groups : 2 0 5 -> Ġ$ expanded Groups ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠNOT _ LIMIT Ġ= Ġ- 1 ĊĠĠĠ Ġ} Ċ } ĊĊ