package Ġcom . dev rapid . example Ċ Ċ import Ġandroidx . recyclerview . widget . Diff Util Ċ import Ġcom . dev rapid . adapt iver ec y cl er view . Adaptive Adapter Ċ import Ġcom . dev rapid . adapt iver ec y cl er view . Adaptive ViewHolder Ċ import Ġcom . dev rapid . example . view type . Multi Type Factory Ċ Ċ /** Ċ Ġ* Ġ@ author Ġ Ġji ey i Ċ Ġ* Ġ@ since ĠĠĠ 9 / 7 / 1 7 Ċ Ġ*/ Ċ class ĠExpand Adapter ( override Ġvar Ġdata List : ĠMutable List < I Expand Visitor >): ĊĠĠĠ ĠAdapt ive Adapter < Multi Type Factory , ĠI Expand Visitor , ĠAdapt ive ViewHolder < Multi Type Factory , ĠI Expand Visitor >>() Ġ{ ĊĠĠĠ Ġoverride Ġvar Ġtype Factory : ĠMulti Type Factory Ġ= ĠMulti Type Factory () ĊĠĠĠ Ġprivate Ġval Ġoriginal Parent Position : ĠMutable List < Int > Ġ= ĠMutable List ( this . data List . size , Ġ{ Ġ 0 Ġ}) ĊĊĠĠĠ Ġclass ĠExpand Diff Util ( private Ġvar Ġold List : ĠMutable List < I Expand Visitor >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġvar Ġnew List : ĠMutable List < I Expand Visitor >): ĠDiff Util . Callback () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Old List Size (): ĠInt Ġ= Ġthis . old List . size ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget New List Size (): ĠInt Ġ= Ġnew List . size ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġare Items The Same ( old Item Position : ĠInt , Ġnew Item Position : ĠInt ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . old List [ old Item Position ]. hashCode () Ġ== Ġthis . new List [ new Item Position ]. hashCode () ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġare Contents The Same ( old Item Position : ĠInt , Ġnew Item Position : ĠInt ): ĠBoolean Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġexpand ( position : ĠInt , Ġnew Index : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . update List Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsub List Ġ= Ġthis . data List [ new Index ]. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . change Visible Child Number ( position , Ġit . child ItemList . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . is Expand able Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . child ItemList ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArrayList ( data List ). to Mutable List (). apply Ġ{ Ġadd All ( new Index Ġ+ Ġ 1 , Ġsub List Ġas ĠCollection < I Expand Visitor >) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcollapse ( position : ĠInt , Ġnew Index : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . update List Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsub List Ġ= Ġthis . data List [ new Index ]. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . change Visible Child Number ( position , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . is Expand able Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . child ItemList ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArrayList ( data List ). to Mutable List (). apply Ġ{ Ġsub List ( new Index Ġ+ Ġ 1 , Ġnew Index Ġ+ Ġ 1 Ġ+ Ġsub List . size ). clear () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcalculate Index ( old Pos : ĠInt ): ĠInt Ġ= Ġ( 0 .. ( old Pos Ġ- Ġ 1 )). sum By Ġ{ Ġthis . original Parent Position [ it ] Ġ} Ġ+ Ġold Pos ĊĊĠĠĠ Ġfun Ġis Collapsed ( position : ĠInt ): ĠBoolean Ġ= Ġthis . data List [ position ]. is Expand able ĊĊĠĠĠ Ġprivate Ġfun Ġupdate List ( getNew List Block : Ġ() Ġ-> ĠMutable List < I Expand Visitor >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew List Ġ= Ġget New List Block () ĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= ĠDiff Util . calculate Diff ( Expand Diff Util ( this . data List , Ġnew List ), Ġtrue ) ĊĠĠĠĠĠĠĠ Ġthis . data List Ġ= Ġnew List ĊĠĠĠĠĠĠĠ Ġres . dispatch Updates To ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġchange Visible Child Number ( index : ĠInt , Ġsize : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . original Parent Position [ index ] Ġ= Ġsize ĊĠĠĠ Ġ} Ċ }