package Ġme . sh ou h eng . uix . widget . rv . decor Ċ Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Paint Ċ import Ġandroid . graphics . Rect Ċ import Ġandroid . graphics . drawable . Bitmap Drawable Ċ import Ġandroid . support . v 7 . widget . RecyclerView Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . View Ċ Ċ /** Ċ Ġ* ĠSample Ġcode : Ċ Ġ* Ċ Ġ* Ġ``` kotlin Ċ Ġ* Ġadapter Ġ= Ġget Adapter ( R . layout . item _ sort , Ġ{ Ġhelper , Ġitem : ĠSort able Item Ġ-> Ġ/* ... */ }, ĠgetData List ()) Ċ Ġ* Ġval Ġdrag Sort Recycler Ġ= ĠDrag Sort Recycler () Ċ Ġ* Ġdrag Sort Recycler . setView Handle Id ( R . id . iv _ handler ) Ċ Ġ* Ġdrag Sort Recycler . setOn Item Moved Listener ( object Ġ: ĠDrag Sort Recycler . On Item Moved Listener Ġ{ Ċ Ġ* ĠĠĠĠ Ġoverride Ġfun Ġon Item Moved ( from : ĠInt , Ġto : ĠInt ) Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġtry Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproject Ġ= Ġadapter . getItem ( from ) !! Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . data . remove At ( from ) Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . data . add ( to , Ġproject ) Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . notify DataSet Changed () Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠ ĠL . e ("$ e ") Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġ} Ċ Ġ* ĠĠĠĠ Ġ} Ċ Ġ* Ġ}) Ċ Ġ* Ġbinding . rv . addItem Decoration ( drag Sort Recycler ) Ċ Ġ* Ġbinding . rv . add On Item Touch Listener ( drag Sort Recycler ) Ċ Ġ* Ġbinding . rv . add On Scroll Listener ( drag Sort Recycler . scroll Listener ) Ċ Ġ* Ġ``` Ċ Ġ*/ Ċ class ĠDrag Sort Recycler Ġ: ĠRecyclerView . Item Decoration (), ĠRecyclerView . On Item Touch Listener Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġmove Interface : ĠOn Item Moved Listener ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġdrag StateChanged Listener : ĠOn Drag StateChanged Listener ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġbg Color Ġ= ĠPaint () ĊĠĠĠ Ġprivate Ġvar Ġdrag Handle Width Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġselected Drag Item Pos Ġ= Ġ- 1 ĊĠĠĠ Ġprivate Ġvar Ġfinger Anchor Y : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġvar Ġscroll Listener : ĠRecyclerView . On Scroll Listener Ġ= Ġobject Ġ: ĠRecyclerView . On Scroll Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scroll StateChanged ( re cyclerView : ĠRecyclerView , ĠnewState : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Scroll StateChanged ( re cyclerView , ĠnewState ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Sc rolled ( re cyclerView : ĠRecyclerView , Ġdx : ĠInt , Ġdy : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Sc rolled ( re cyclerView , Ġdx , Ġdy ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdebug Log (" Sc rolled : Ġ$ dx Ġ$ dy ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinger Anchor Y Ġ-= Ġdy ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġinternal Ġset ĊĠĠĠ Ġprivate Ġvar Ġfinger Y : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġfinger Offset In View Y : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġauto Scroll Window Ġ= Ġ 0 . 1 f ĊĠĠĠ Ġprivate Ġvar Ġauto Scroll Speed Ġ= Ġ 0 . 5 f ĊĠĠĠ Ġprivate Ġvar Ġfloating Item : ĠBitmap Drawable ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġfloating Item St ating Bounds : ĠRect ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġfloating Item Bounds : ĠRect ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġfloating Item Alpha Ġ= Ġ 0 . 5 f ĊĠĠĠ Ġprivate Ġvar Ġfloating Item Bg Color Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġview Handle Id Ġ= Ġ- 1 ĊĠĠĠ Ġprivate Ġvar Ġis Dragging : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġfun Ġdebug Log ( log : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( DEBUG ) ĠLog . d ( TAG , Ġlog ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ* ĠSet Ġthe Ġitem Ġmove Ġinterface ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset On Item Moved Listener ( sw if : ĠOn Item Moved Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmove Interface Ġ= Ġsw if ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset View Handle Id ( id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġview Handle Id Ġ= Ġid ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Left Drag Area ( w : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdrag Handle Width Ġ= Ġw ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Floating Alpha ( a : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfloating Item Alpha Ġ= Ġa ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Floating Bg Color ( c : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfloating Item Bg Color Ġ= Ġc ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠĠ ĠSet Ġthe Ġwindow Ġat Ġtop Ġand Ġbottom Ġof Ġlist , Ġmust Ġbe Ġbetween Ġ 0 Ġand Ġ 0 . 5 ĊĠĠĠĠ ĠFor Ġexample Ġ 0 . 1 Ġuses Ġthe Ġtop Ġand Ġbottom Ġ 1 0 % Ġof Ġthe Ġlists Ġfor Ġscrolling ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Auto Scroll Window ( w : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġauto Scroll Window Ġ= Ġw ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠ ĠSet Ġthe Ġaut osc roll Ġspeed , Ġdefault Ġis Ġ 0 . 5 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Auto Scroll Speed ( speed : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġauto Scroll Speed Ġ= Ġspeed ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem Offsets ( out Rect : ĠRect , Ġview : ĠView , Ġrv : ĠRecyclerView , Ġstate : ĠRecyclerView . State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . getItem Offsets ( out Rect , Ġview , Ġrv , Ġstate ) ĊĊĠĠĠĠĠĠĠ Ġdebug Log (" getItem Offsets ") ĊĊĠĠĠĠĠĠĠ Ġdebug Log (" View Ġtop Ġ= Ġ" Ġ+ Ġview . top ) ĊĠĠĠĠĠĠĠ Ġif Ġ( selected Drag Item Pos Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Pos Ġ= Ġrv . getChild Layout Position ( view ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdebug Log (" item Pos Ġ=$ item Pos ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! can Drag Over ( item Pos )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Movement Ġof Ġfinger ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtotal Movement Ġ= Ġ( f inger Y Ġ- Ġfinger Anchor Y ). toFloat () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item Pos Ġ== Ġselected Drag Item Pos ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Make Ġview Ġvisible Ġin case Ġinvisible ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . visibility Ġ= ĠView . VISIBLE ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Find Ġmiddle Ġof Ġthe Ġfloating Item ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfloat Middle Y Ġ= Ġ( floating Item Bounds !!. top Ġ+ Ġfloating Item Bounds !!. height () Ġ/ Ġ 2 ). toFloat () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Moving Ġdown Ġthe Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// These Ġwill Ġauto - animate Ġif Ġthe Ġdevice Ġcontin ually Ġsends Ġtouch Ġmotion Ġevents ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġ( total Mov ment > 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item Pos Ġ> Ġselected Drag Item Pos Ġ&& Ġview . top Ġ< Ġfloat Middle Y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġamount Up Ġ= Ġ( float Middle Y Ġ- Ġview . top ) Ġ/ Ġview . height . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġamount Up Ġ*= Ġ 0 . 5 f ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( amount Up Ġ> Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġamount Up Ġ= Ġ 1 f ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Rect . top Ġ= Ġ-( floating Item Bounds !!. height () Ġ* Ġamount Up ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Rect . bottom Ġ= Ġ( floating Item Bounds !!. height () Ġ* Ġamount Up ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}// Moving Ġup Ġthe Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġelse Ġif Ġ( total Mov ment Ġ< Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item Pos Ġ< Ġselected Drag Item Pos Ġ&& Ġview . bottom Ġ> Ġfloat Middle Y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġamount Down Ġ= Ġ( view . bottom . toFloat () Ġ- Ġfloat Middle Y ) Ġ/ Ġview . height . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġamount Down Ġ*= Ġ 0 . 5 f ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( amount Down Ġ> Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġamount Down Ġ= Ġ 1 f ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Rect . top Ġ= Ġ( floating Item Bounds !!. height () Ġ* Ġamount Down ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Rect . bottom Ġ= Ġ-( floating Item Bounds !!. height () Ġ* Ġamount Down ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout Rect . top Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout Rect . bottom Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Make Ġview Ġvisible Ġin case Ġinvisible ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFind Ġthe Ġnew Ġposition Ġby Ġscanning Ġthrough Ġthe Ġitems Ġon ĊĠĠĠĠ Ġ* Ġscreen Ġand Ġfinding Ġthe Ġpositional Ġrelationship . ĊĠĠĠĠ Ġ* ĠThis Ġ* se ems * Ġto Ġwork , Ġanother Ġmethod Ġwould Ġbe Ġto Ġuse ĊĠĠĠĠ Ġ* ĠgetItem Offsets , Ġbut ĠI Ġthink Ġthat Ġcould Ġmiss Ġitems ? .. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget New Post ion ( rv : ĠRecyclerView ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġitems On Screen Ġ= Ġrv . layout Manager !!. child Count ĊĊĠĠĠĠĠĠĠ Ġval Ġfloat Middle Y Ġ= Ġ( floating Item Bounds !!. top Ġ+ Ġfloating Item Bounds !!. height () Ġ/ Ġ 2 ). toFloat () ĊĊĠĠĠĠĠĠĠ Ġvar Ġabove Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġbelow Ġ= ĠInteger . MAX _ VALUE ĊĠĠĠĠĠĠĠ Ġfor Ġ( n Ġin Ġ 0 Ġuntil Ġitems On Screen ) ĊĠĠĠĠĠĠĠ Ġ// Scan Ġthough Ġitems Ġon Ġscreen , Ġhowever Ġthey Ġmay Ġnot ĊĠĠĠĠĠĠĠ Ġ{ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbe Ġin Ġorder ! ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġrv . layout Manager !!. getChild At ( n ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( view !!. visibility Ġ!= ĠView . VISIBLE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Pos Ġ= Ġrv . getChild Layout Position ( view ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item Pos Ġ== Ġselected Drag Item Pos ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Don 't Ġcheck Ġagainst Ġitself ! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Middle Y Ġ= Ġ( view . top Ġ+ Ġview . height Ġ/ Ġ 2 ). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( float Middle Y Ġ> Ġview Middle Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Is Ġabove Ġthis Ġitem ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item Pos Ġ> Ġabove ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġabove Ġ= Ġitem Pos ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( float Middle Y Ġ<= Ġview Middle Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Is Ġbelow Ġthis Ġitem ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item Pos Ġ< Ġbelow ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbelow Ġ= Ġitem Pos ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdebug Log (" above Ġ= Ġ$ above Ġbelow Ġ= Ġ$ below ") ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( below Ġ!= ĠInteger . MAX _ VALUE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( below Ġ< Ġselected Drag Item Pos ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Need Ġto Ġcount Ġitself ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbelow ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbelow Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( above Ġ< Ġselected Drag Item Pos ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġabove ++ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġabove ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġon Intercept Touch Event ( rv : ĠRecyclerView , Ġe : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġdebug Log (" on Intercept Touch Event ") ĊĊĠĠĠĠĠĠĠ Ġ// if Ġ( e . getAction () Ġ== ĠMotion Event . ACTION _ DOWN ) ĊĠĠĠĠĠĠĠ Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠitemView Ġ= Ġrv . find Child View Under ( e . x , Ġe . y ) Ġ?: Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdragging Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( drag Handle Width Ġ> Ġ 0 Ġ&& Ġe . x Ġ< Ġdrag Handle Width ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdragging Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( view Handle Id Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Find Ġthe Ġhandle Ġin Ġthe Ġlist Ġitem ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhandle View Ġ= ĠitemView . findViewById < View >( view Handle Id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( handle View Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" The Ġview ĠID Ġ$ view Handle Id Ġwas Ġnot Ġfound Ġin Ġthe ĠRe cycle View Ġitem ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// View Ġshould Ġbe Ġvisible Ġto Ġdrag ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( handle View . visibility Ġ!= ĠView . VISIBLE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// We Ġneed Ġto Ġfind Ġthe Ġrelative Ġposition Ġof Ġthe Ġhandle Ġto Ġthe Ġparent Ġview ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Then Ġwe Ġcan Ġwork Ġout Ġif Ġthe Ġtouch Ġis Ġwithin Ġthe Ġhandle ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent Item Pos Ġ= ĠInt Array ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . getLocation In Window ( parent Item Pos ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhandle Pos Ġ= ĠInt Array ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle View . getLocation In Window ( handle Pos ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Rel Ġ= Ġhandle Pos [ 0 ] Ġ- Ġparent Item Pos [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Rel Ġ= Ġhandle Pos [ 1 ] Ġ- Ġparent Item Pos [ 1 ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtouch Bounds Ġ= ĠRect ( item View . left Ġ+ Ġx Rel , ĠitemView . top Ġ+ Ġy Rel , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . left Ġ+ Ġx Rel Ġ+ Ġhandle View . width , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . top Ġ+ Ġy Rel Ġ+ Ġhandle View . height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( touch Bounds . contains ( e . x . toInt (), Ġe . y . toInt ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdragging Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdebug Log (" parent Item Pos Ġ= Ġ" Ġ+ Ġparent Item Pos [ 0 ] Ġ+ Ġ" Ġ" Ġ+ Ġparent Item Pos [ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdebug Log (" handle Pos Ġ= Ġ" Ġ+ Ġhandle Pos [ 0 ] Ġ+ Ġ" Ġ" Ġ+ Ġhandle Pos [ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( drag ging ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdebug Log (" Started ĠDrag ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetIs Dragging ( true ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfloating Item Ġ= Ġcreate Floating Bitmap ( item View ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinger Anchor Y Ġ= Ġe . y . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinger Offset In View Y Ġ= Ġfinger Anchor Y Ġ- ĠitemView . top ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinger Y Ġ= Ġfinger Anchor Y ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Drag Item Pos Ġ= Ġrv . getChild Layout Position ( item View ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdebug Log (" selected Drag Item Pos Ġ= Ġ$ selected Drag Item Pos ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Request Dis allow Intercept Touch Event ( b : ĠBoolean ) Ġ{ ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Touch Event ( rv : ĠRecyclerView , Ġe : ĠMotion Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdebug Log (" on Touch Event ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( e . action Ġ== ĠMotion Event . ACTION _ UP Ġ|| Ġe . action Ġ== ĠMotion Event . ACTION _ CANCEL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e . action Ġ== ĠMotion Event . ACTION _ UP Ġ&& Ġselected Drag Item Pos Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Pos Ġ= Ġget New Post ion ( rv ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( move Interface Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove Interface !!. on Item Moved ( selected Drag Item Pos , Ġnew Pos ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetIs Dragging ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselected Drag Item Pos Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfloating Item Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrv . invalidate Item Decor ations () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġfinger Y Ġ= Ġe . y . toInt () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( floating Item Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfloating Item Bounds !!. top Ġ= Ġfinger Y Ġ- Ġfinger Offset In View Y ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( floating Item Bounds !!. top Ġ< Ġ- floating Item St ating Bounds !!. height () Ġ/ Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Allow Ġhalf Ġthe Ġview Ġout Ġthe Ġtop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfloating Item Bounds !!. top Ġ= Ġ- floating Item St ating Bounds !!. height () Ġ/ Ġ 2 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfloating Item Bounds !!. bottom Ġ= Ġfloating Item Bounds !!. top Ġ+ Ġfloating Item St ating Bounds !!. height () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfloating Item !!. bounds Ġ= Ġfloating Item Bounds !! ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Do Ġauto Ġscrolling Ġat Ġend Ġof Ġlist ĊĠĠĠĠĠĠĠ Ġvar Ġscroll Amount Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġif Ġ( f inger Y Ġ> Ġrv . height Ġ* Ġ( 1 Ġ- Ġauto Scroll Window )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscroll Amount Ġ= Ġfinger Y Ġ- Ġrv . height Ġ* Ġ( 1 Ġ- Ġauto Scroll Window ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( f inger Y Ġ< Ġrv . height Ġ* Ġauto Scroll Window ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscroll Amount Ġ= Ġfinger Y Ġ- Ġrv . height Ġ* Ġauto Scroll Window ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdebug Log (" Scroll : Ġ$ scroll Amount ") ĊĊĠĠĠĠĠĠĠ Ġscroll Amount Ġ*= Ġauto Scroll Speed ĊĠĠĠĠĠĠĠ Ġrv . scroll By ( 0 , Ġscroll Amount . toInt ()) ĊĊĠĠĠĠĠĠĠ Ġrv . invalidate Item Decor ations () // ĠRed raw ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠsetIs Dragging ( drag ging : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( drag ging Ġ!= Ġis Dragging ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Dragging Ġ= Ġdragging ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( drag StateChanged Listener Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Dragging ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrag StateChanged Listener !!. on Drag Start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrag StateChanged Listener !!. on Drag Stop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset On Drag StateChanged Listener ( drag StateChanged Listener : ĠOn Drag StateChanged Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . drag StateChanged Listener Ġ= Ġdrag StateChanged Listener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Draw Over ( c : ĠCanvas , Ġparent : ĠRecyclerView , Ġstate : ĠRecyclerView . State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( floating Item Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfloating Item !!. alpha Ġ= Ġ( 2 5 5 Ġ* Ġfloating Item Alpha ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbg Color . color Ġ= Ġfloating Item Bg Color ĊĠĠĠĠĠĠĠĠĠĠĠ Ġc . draw Rect ( floating Item Bounds !! , Ġbg Color ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfloating Item !!. draw ( c ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġposition ĊĠĠĠĠ Ġ* Ġ@ return ĠTrue Ġif Ġwe Ġcan Ġdrag Ġthe Ġitem Ġover Ġthis Ġposition , ĠFalse Ġif Ġnot . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġcan Drag Over ( position : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Floating Bitmap ( v : ĠView ): ĠBitmap Drawable Ġ{ ĊĠĠĠĠĠĠĠ Ġfloating Item St ating Bounds Ġ= ĠRect ( v . left , Ġv . top , Ġv . right , Ġv . bottom ) ĊĠĠĠĠĠĠĠ Ġfloating Item Bounds Ġ= ĠRect ( floating Item St ating Bounds ) ĊĊĠĠĠĠĠĠĠ Ġval Ġbitmap Ġ= ĠBitmap . create Bitmap ( floating Item St ating Bounds !!. width (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfloating Item St ating Bounds !!. height (), ĠBitmap . Config . ARGB _ 8 8 8 8 ) ĊĠĠĠĠĠĠĠ Ġval Ġcanvas Ġ= ĠCanvas ( bitmap ) ĊĠĠĠĠĠĠĠ Ġv . draw ( canvas ) ĊĊĠĠĠĠĠĠĠ Ġval Ġret Drawable Ġ= ĠBitmap Drawable ( v . resources , Ġbitmap ) ĊĠĠĠĠĠĠĠ Ġret Drawable . bounds Ġ= Ġfloating Item Bounds !! ĊĊĠĠĠĠĠĠĠ Ġreturn Ġret Drawable ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠOn Item Moved Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġon Item Moved ( from : ĠInt , Ġto : ĠInt ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠOn Drag StateChanged Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġon Drag Start () ĊĠĠĠĠĠĠĠ Ġfun Ġon Drag Stop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTAG Ġ= Ġ" Drag Sort Recycler " ĊĠĠĠĠĠĠĠ Ġval ĠDEBUG Ġ= Ġfalse ĊĠĠĠ Ġ} Ċ } Ċ