package Ġcom . time . cat . drag board view . adapter _ kt Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . annotation . Int Range Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . time . cat . drag board view . callback _ kt . Drag Horizontal Adapter Ċ import Ġcom . time . cat . drag board view . callback _ kt . Drag Horizontal ViewHolder Ċ import Ġcom . time . cat . drag board view . helper _ kt . Drag Helper Ċ import Ġcom . time . cat . drag board view . model _ kt . Drag Column Ċ import Ġjava . util .* Ċ import Ġkotlin . math . abs Ċ Ċ /** Ċ Ġ* Created Ġby Ġf arr uk h _ kh Ġon Ġ 8 / 2 / 2 1 Ġ 1 1 : 0 8 ĠAM Ċ Ġ* com . time . cat . drag board view . adapter _ kt Ċ Ġ**/ Ċ abstract Ġclass ĠHorizontal Adapter < VH Ġ: ĠHorizontal Adapter < VH >. ViewHolder >( ĊĠĠĠ Ġprivate Ġval Ġcontext : ĠContext Ċ ) Ġ: ĠRecyclerView . Adapter < VH >(), ĠDrag Horizontal Adapter Ġ{ ĊĊĠĠĠ Ġvar Ġm Data Ġ= Ġmutable ListOf < Drag Column >() ĊĠĠĠ Ġvar Ġdrag Helper : ĠDrag Helper ? Ġ= Ġnull ĊĊĠĠĠ Ġ// The Ġposition Ġof Ġthe ĠView Ġbeing Ġdrag ged ĊĠĠĠ Ġprivate Ġvar Ġm Drag Position Ġ= Ġ 0 ĊĊĠĠĠ Ġ// Whether Ġto Ġhide Ġthe Ġdragging Ġposition ĊĠĠĠ Ġprivate Ġvar Ġm Hide Drag Item Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠV H Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( need Footer () Ġ&& Ġview Type Ġ== ĠDrag Helper . TYPE _ FO OTER ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠconvertView Ġ= ĠLayoutInflater . from ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. inflate ( get Footer Layout Res (), Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠonCreate ViewHolder ( convert View , ĠDrag Helper . TYPE _ FO OTER ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval ĠconvertView Ġ= ĠLayoutInflater . from ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. inflate ( getContent Layout Res (), Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġreturn ĠonCreate ViewHolder ( convert View , ĠDrag Helper . TYPE _ CONTENT ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠV H , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( getItem ViewType ( position )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDrag Helper . TYPE _ CONTENT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdrag Column Ġ= Ġm Data [ position ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( position Ġ== Ġm Drag Position Ġ&& Ġm Hide Drag Item ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . item View . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . item View . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . item View . tag Ġ= Ġdrag Column ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Bind Content ViewHolder ( holder , Ġdrag Column , Ġposition ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDrag Helper . TYPE _ FO OTER Ġ-> Ġon Bind Footer ViewHolder ( holder , Ġposition ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" There Ġare Ġonly Ġ 2 Ġview Ġtypes ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem Count () Ġ= Ġif Ġ( need Footer ()) Ġm Data . size Ġ+ Ġ 1 Ġelse Ġm Data . size ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem ViewType ( position : ĠInt ) Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġ! need Footer () Ġ-> ĠDrag Helper . TYPE _ CONTENT ĊĠĠĠĠĠĠĠ Ġposition Ġ== Ġitem Count Ġ- Ġ 1 Ġ-> ĠDrag Helper . TYPE _ FO OTER ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĠDrag Helper . TYPE _ CONTENT ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Drag ( position : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Drag Position Ġ= Ġposition ĊĠĠĠĠĠĠĠ Ġm Hide Drag Item Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġnotify Item Changed ( position ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Drop ( page : ĠInt , Ġposition : ĠInt , Ġdrag Column Object : ĠDrag Column ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Hide Drag Item Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ// notify Item Changed ( position ); ĊĠĠĠĠĠĠĠ Ġnotify DataSet Changed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Drag Out () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Drag Position Ġ>= Ġ 0 Ġ&& Ġm Drag Position Ġ< Ġm Data . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Data . remove At ( m Drag Position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Here , Ġif Ġnotify Item Remove Ġis Ġused , Ġthe Ġposition Ġof Ġthe Ġnext Ġselection Ġis Ġwrong ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotify DataSet Changed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Drag Position Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Drag In ( position : ĠInt , Ġdrag Column Object : ĠDrag Column ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġm Position Ġ= Ġposition ĊĠĠĠĠĠĠĠ Ġ// If Ġthe Ġposition Ġwhen Ġdrag ged Ġin Ġis Ġgreater Ġthan Ġthe Ġlength Ġof Ġthe Ġcurrent Ġlist , ĊĠĠĠĠĠĠĠ Ġ// Ġit Ġwill Ġbe Ġadded Ġto Ġthe Ġend Ġof Ġthe Ġlist ĊĠĠĠĠĠĠĠ Ġif Ġ( m Position Ġ> Ġm Data . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Position Ġ= Ġm Data . size ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Data . add ( m Position , Ġdrag Column Object ) ĊĠĠĠĠĠĠĠ Ġnotify Item Inserted ( m Position ) ĊĠĠĠĠĠĠĠ Ġm Drag Position Ġ= Ġm Position ĊĠĠĠĠĠĠĠ Ġm Hide Drag Item Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Drag Item Visibility ( position : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Drag Position Ġ>= Ġ 0 Ġ&& Ġm Drag Position Ġ< Ġm Data . size Ġ&& Ġposition Ġ< Ġm Data . size Ġ&& Ġm Drag Position Ġ!= Ġposition ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( abs ( m Drag Position Ġ- Ġposition ) Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Item Changed ( m Drag Position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCollections . swap ( m Data , Ġm Drag Position , Ġposition ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Drag Position Ġ= Ġposition ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Item Changed ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Item Changed ( m Drag Position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Drag Position Ġ> Ġposition ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġm Drag Position Ġdown To Ġposition Ġ+ Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCollections . swap ( m Data , Ġi , Ġi Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Item Changed ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġm Drag Position Ġuntil Ġposition ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCollections . swap ( m Data , Ġi , Ġi Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Item Changed ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Drag Position Ġ= Ġposition ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Item Changed ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġappend New Column ( drag Column : ĠDrag Column ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Data . add ( drag Column ) ĊĠĠĠĠĠĠĠ Ġnotify Item Inserted ( item Count Ġ- Ġ 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd New Column (@ Int Range ( from Ġ= Ġ 0 ) Ġposition : ĠInt , Ġdrag Column : ĠDrag Column ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Data . add ( position , Ġdrag Column ) ĊĠĠĠĠĠĠĠ Ġnotify Item Inserted ( position ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdrag Col ( column View : ĠView , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdrag Helper ?. drag Col ( column View , Ġposition ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdrag Col ( holder : ĠV H ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdrag Col ( holder . item View , Ġholder . adapter Position ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġfun ĠgetContent Layout Res (): ĠInt ĊĠĠĠ Ġabstract Ġfun Ġget Footer Layout Res (): ĠInt ĊĠĠĠ Ġabstract Ġfun ĠonCreate ViewHolder ( parent : ĠView ?, Ġview Type : ĠInt ): ĠV H ĊĠĠĠ Ġabstract Ġfun Ġon Bind Content ViewHolder ( holder : ĠV H , Ġdrag Column : ĠDrag Column ?, Ġposition : ĠInt ) ĊĠĠĠ Ġabstract Ġfun Ġon Bind Footer ViewHolder ( holder : ĠV H , Ġposition : ĠInt ) ĊĠĠĠ Ġabstract Ġfun Ġneed Footer (): ĠBoolean ĊĊĠĠĠ Ġabstract Ġinner Ġclass ĠViewHolder ( convert View : ĠView , Ġitem Type : ĠInt ) Ġ: ĊĠĠĠĠĠĠĠ ĠRecyclerView . ViewHolder ( convert View ), ĠDrag Horizontal ViewHolder Ġ{ ĊĠĠĠĠĠĠĠ Ġabstract Ġoverride Ġfun Ġget RecyclerView (): ĠRecyclerView ĊĠĠĠĠĠĠĠ Ġabstract Ġoverride Ġfun Ġfind View For Content ( item View : ĠView ) ĊĠĠĠĠĠĠĠ Ġabstract Ġoverride Ġfun Ġfind View For Footer ( item View : ĠView ) ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item Type Ġ== ĠDrag Helper . TYPE _ CONTENT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfind View For Content ( convert View ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfind View For Footer ( convert View ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }