package Ġcom . focused swipe able list item . core Ċ Ċ import Ġandroid . animation . Animator Ċ import Ġandroid . animation . Animator Listener Adapter Ċ import Ġandroid . content . Context Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . Gravity Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . view . animation . De cel erate Interpolator Ċ import Ġandroid . widget . Frame Layout Ċ import Ġandroidx . collection . Sparse Array Compat Ċ import Ġandroidx . core . util . Pools Ċ import Ġandroidx . core . view . View Compat Ċ import Ġcom . focused swipe able list item . api . ClickListener Ċ import Ġcom . focused swipe able list item . api . Fl ing Enter Listener Ċ import Ġcom . focused swipe able list item . api . Fl ing Exit Listener Ċ import Ġcom . focused swipe able list item . dip Ċ Ċ /** Ċ Ġ* Base Ġadapter Ġthat Ġmanages Ġthe Ġcreation Ġand Ġre cycl ing Ġof Ġsw ip ed Ġaway Ġviews Ċ Ġ*/ Ċ abstract Ġclass ĠSw ipe able Adapter < T Ġ: ĠSw ipe able Adapter . ViewHolder >( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġroot Frame Layout : ĠFrame Layout , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġinitial Rotation : ĠFloat Ġ= Ġ 1 5 f , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġenable Left Swipe : ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġenable Right Swipe : ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġenable Top Swipe : ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġenable Bottom Swipe : ĠBoolean Ġ= Ġtrue ) Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġattached Views By Position : ĠSparse Array Compat < T > ĊĊĠĠĠ Ġprivate Ġvar Ġcurrent Views Position Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġcurrent Visible Position Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġis Setup : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġre cyc led Views Pool : ĠRe cyc led Views Pool < T > ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġre cyclerView Pool : ĠP ools . Simple Pool < T > ĊĊĠĠĠ Ġvar Ġfl ing Enter Listener : ĠF ling Enter Listener ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġfl ing Exit Listener : ĠF ling Exit Listener ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġclick Listener : ĠClick Listener ? Ġ= Ġnull ĊĊĊĠĠĠ Ġprivate Ġvar Ġmain Fl ing Listener Ġ= Ġobject Ġ: ĠF ling Exit Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbottom Exit ( view : ĠView , ĠdataObject : ĠAny ?, Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfl ing Exit Listener ?. bottom Exit ( view , ĠdataObject , Ġcurrent Visible Position ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġtop Exit ( view : ĠView , ĠdataObject : ĠAny ?, Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfl ing Exit Listener ?. top Exit ( view , ĠdataObject , Ġcurrent Visible Position ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Card Exit ed ( view : ĠView , Ġobject X : ĠFloat , Ġobject Y : ĠFloat , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Visible Position -- ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġattached Views By Position . size ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġattached Views By Position . key At ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġget Ġthe Ġobject Ġby Ġthe Ġkey . ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattached Views By Position . get ( key )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . itemId Ġ== Ġview . id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove And Re cycle View ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( root Frame Layout . child Count Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfl ing Exit Listener ?. on Card Exit ed ( view , Ġobject X , Ġobject Y , Ġget Exit ing Position ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon All Items Sw ip ed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Views Position Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattach Touch Listener To Last View () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfl ing Exit Listener ?. on Card Exit ed ( view , Ġobject X , Ġobject Y , Ġget Exit ing Position ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġadjust View Margins ( view ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew View Ġ= Ġcreate ViewHolder ( root Frame Layout ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadjust View Margins ( new View . item View , Ġview . dip ( 1 6 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew View . itemId Ġ= Ġnew View . item View . id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew View . item View . layout Params Ġ= Ġcreate Default LayoutParams () ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġattached Views By Position . append ( new View . itemId , Ġnew View ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew View . re Adjust View () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot Frame Layout . addView ( new View . item View , Ġ 0 ) ĊĊĊĊ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattach Touch Listener To Last View () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon BindView ( new View ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" swipe ", Ġ" current Views Position : Ġ$ current Views Position ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfl ing Exit Listener ?. on Card Exit ed ( view , Ġobject X , Ġobject Y , Ġget Exit ing Position ()) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġleft Exit ( view : ĠView , ĠdataObject : ĠAny ?, Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfl ing Exit Listener ?. left Exit ( view , ĠdataObject , Ġcurrent Visible Position ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġright Exit ( view : ĠView , ĠdataObject : ĠAny ?, Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfl ing Exit Listener ?. right Exit ( view , ĠdataObject , Ġcurrent Visible Position ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scroll ( view : ĠView , Ġscroll Progress Percent X : ĠFloat , Ġscroll Progress Percent Y : ĠFloat , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfl ing Exit Listener ?. on Scroll ( view , Ġscroll Progress Percent X , Ġscroll Progress Percent Y , Ġget Real Current Position ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġmain ClickListener Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠClick Listener Ġ{ Ġview , ĠdataObject , Ġdirection Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclick Listener ?. onClick ( view , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataObject , Ġdirection ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMake Ġsure Ġthat Ġthe Ġtop Ġmost Ġview Ġonly Ġgets Ġthe Ġtouch Ġlistener ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġattach Touch Listener To Last View () Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠindexOf Last Child Ġ= Ġroot Frame Layout . child Count Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġchild At Ġ= Ġroot Frame Layout . getChild At ( indexOf Last Child ) ĊĠĠĠĠĠĠĠ Ġif Ġ( child At Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattach Touch Listener ( child At ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġwhen Ġall Ġitems Ġprovided Ġby Ġthe Ġadapter Ġhas Ġbeen Ġsw ip ed Ġaway ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġopen Ġfun Ġon All Items Sw ip ed () Ġ{} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġwhen Ġnew Ġview Ġis Ġneeded Ġto Ġbe Ġcreated ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġit Ġis Ġadv ised Ġto Ġcall Ġthe Ġhelper Ġmethod Ġ@ link { create View ()} ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġcreate ViewHolder ( parent View : ĠViewGroup , Ġposition : ĠInt Ġ= Ġcurrent Views Position ): ĠT ĊĊĠĠĠ Ġprivate Ġfun Ġadjust View Margins ( view : ĠView , Ġtop Margin : ĠInt Ġ= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ( view . layout Params Ġas ĠFrame Layout . LayoutParams ). top Margin Ġ= Ġtop Margin ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetLast View (): ĠView Ġ= Ġroot Frame Layout . getChild At ( root Frame Layout . child Count Ġ- Ġ 1 ) ĊĊĊĠĠĠ Ġprivate Ġfun Ġremove And Re cycle View ( view Holder : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Setup () ĊĠĠĠĠĠĠĠ ĠviewHolder . item View . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( view Holder . item View . parent Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewHolder . item View . setOn Touch Listener ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot Frame Layout . remove View ( view Holder . item View ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIndex OutOfBoundsException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġattached Views By Position . remove ( view Holder . item View . id ) Ċ // ĠĠĠĠĠĠĠ Ġre cyc led Views Pool . recycle View ( view Holder ) ĊĠĠĠĠĠĠĠ Ġon View Re cyc led ( view Holder ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġshould Ġbe Ġcalled Ġon Ġthe Ġinitialization Ġof Ġthe Ġchild Ġclass ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġsetup Adapter () Ġ{ ĊĠĠĠĠĠĠĠ Ġis Setup Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġcurrent Views Position Ġ= ĠgetItem Count () Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġcurrent Visible Position Ġ= ĠgetItem Count () Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġre cyc led Views Pool Ġ= ĠRe cyc led Views Pool ( getView PoolSize ()) ĊĠĠĠĠĠĠĠ Ġre cyclerView Pool Ġ= ĠP ools . Simple Pool ( getView PoolSize ()) ĊĊĠĠĠĠĠĠĠ Ġattached Views By Position Ġ= ĠSparse Array Compat ( getView PoolSize ()) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġget View PoolSize ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcreated ViewHolder Ġ= Ġcreate ViewHolder ( root Frame Layout ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreated ViewHolder . itemId Ġ= Ġcreated ViewHolder . item View . id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattached Views By Position . append ( created ViewHolder . itemId , Ġcreated ViewHolder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon BindView ( created ViewHolder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot Frame Layout . addView ( created ViewHolder . item View , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġattach Touch Listener Post ( root Frame Layout . getChild At ( root Frame Layout . child Count Ġ- Ġ 1 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġhelper Ġmethod Ġto Ġremove Ġthe Ġhass le Ġof Ġcreating Ġthe Ġview Ġyourself ĊĠĠĠĠ Ġ* Ġ@ param Ġlayout Res Ġthe Ġlayout Ġto Ġbe Ġinfl ated ĊĠĠĠĠ Ġ* Ġ@ param Ġparent Ġthe Ġview group Ġthat Ġthis Ġview Ġbelongs Ġto ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġcreated Ġview ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġopen Ġfun Ġcreate View ( layout Res : ĠInt , Ġparent : ĠViewGroup ): ĠView Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Setup () ĊĊĠĠĠĠĠĠĠ Ġval Ġtouch ableView Ġ= ĠLayoutInflater . from ( context ). inflate ( layout Res , Ġparent , Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġtouch ableView . id Ġ= ĠView Compat . generate View Id () ĊĠĠĠĠĠĠĠ Ġval Ġlayout Params Ġ= Ġcreate Default LayoutParams () ĊĠĠĠĠĠĠĠ Ġtouch ableView . layout Params Ġ= Ġlayout Params ĊĊ Ċ // ĠĠĠĠĠĠĠ Ġattach Touch Listener Post ( touch ableView ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtouch ableView ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġtouch Ġlistener Ġneeds Ġto Ġknow Ġthe Ġcoordinates Ġof Ġits Ġview , Ġthus Ġwe Ġneed Ġto Ġwait Ġuntil Ġthe Ġview Ġhas ĊĠĠĠĠ Ġ* Ġbeen Ġdrawn Ġthen Ġassign Ġit Ġthus Ġthe Ġsuffix ĠPost ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġattach Touch Listener Post ( touch ableView : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġview Group Ġ= Ġtouch ableView . parent Ġas ? ĠViewGroup ĊĊĠĠĠĠĠĠĠ Ġview Group ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġall Views Count Ġ= Ġit . child Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġall Views Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . getChild At ( i )?. setOn Touch Listener ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġtouch ableView . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfl ing Card Listener Ġ= ĠF ling Card Listener ( touch ableView , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtouch ableView , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Rotation , Ġmain Fl ing Listener , Ġmain ClickListener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfl ing Card Listener . set Allow Left Swipe ( enable Left Swipe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfl ing Card Listener . set Allow Right Swipe ( enable Right Swipe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfl ing Card Listener . set Allow Top Swipe ( enable Top Swipe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfl ing Card Listener . set Allow Bottom Swipe ( enable Bottom Swipe ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtouch ableView . setOn Touch Listener ( fl ing Card Listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtouch ableView . tag Ġ= Ġfl ing Card Listener ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġattach Touch Listener ( touch ableView : ĠView ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġall Views Count Ġ= Ġroot Frame Layout . child Count ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġall Views Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot Frame Layout . getChild At ( i )?. setOn Touch Listener ( null ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġval Ġfl ing Card Listener Ġ= ĠF ling Card Listener ( touch ableView , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtouch ableView , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Rotation , Ġmain Fl ing Listener , Ġmain ClickListener ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġfl ing Card Listener . set Allow Left Swipe ( enable Left Swipe ) ĊĠĠĠĠĠĠĠ Ġfl ing Card Listener . set Allow Right Swipe ( enable Right Swipe ) ĊĠĠĠĠĠĠĠ Ġfl ing Card Listener . set Allow Top Swipe ( enable Top Swipe ) ĊĠĠĠĠĠĠĠ Ġfl ing Card Listener . set Allow Bottom Swipe ( enable Bottom Swipe ) ĊĊĠĠĠĠĠĠĠ Ġtouch ableView . setOn Touch Listener ( fl ing Card Listener ) ĊĠĠĠĠĠĠĠ Ġtouch ableView . tag Ġ= Ġfl ing Card Listener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Default LayoutParams (): ĠFrame Layout . LayoutParams Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlayout Params Ġ= ĠFrame Layout . LayoutParams ( Frame Layout . LayoutParams . WRAP _ CONTENT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFrame Layout . LayoutParams . WRAP _ CONTENT ) ĊĠĠĠĠĠĠĠ Ġlayout Params . gravity Ġ= ĠGr avity . CENTER ĊĠĠĠĠĠĠĠ Ġreturn Ġlayout Params ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Setup () Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Setup ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" You Ġneed Ġto Ġcall Ġthe Ġsetup Ġmethod Ġin Ġyour Ġconstructor ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠAny () ĊĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġon View Re cyc led ( view Holder : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Setup () ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDetermine Ġthe Ġnumber Ġof Ġstack ed Ġviews Ġat Ġthe Ġsame Ġtime ĊĠĠĠĠ Ġ* ĠDefault Ġis Ġ 2 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġget View PoolSize (): ĠInt ĊĊĊĠĠĠ Ġpublic Ġabstract Ġfun ĠgetItem Count (): ĠInt ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġwhen Ġthe Ġview Ġis Ġready Ġto Ġget Ġbound Ġto Ġnew Ġdata ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġon BindView ( view Holder : ĠT , Ġposition : ĠInt Ġ= Ġcurrent Views Position --) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġclass ĠRe cyc led Views Pool < T Ġ: ĠViewHolder >( val Ġsize : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġviews Pool Ġ= ĠP ools . Synchron ized Pool < T >( size ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpublic Ġfun Ġre cycle View ( toBe Re cyc led : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġviews Pool . release ( toBe Re cyc led ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpublic Ġfun Ġobtain View () Ġ= Ġviews Pool . acquire () ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDI RECTION _ TOP Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDI RECTION _ BOTTOM Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDI RECTION _ LEFT Ġ= Ġ 3 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDI RECTION _ RIGHT Ġ= Ġ 4 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDI RECTION _ NONE Ġ= Ġ 5 ĊĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġclass ĠViewHolder ( val ĠitemView : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠNO _ POSITION Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠNO _ ID : ĠInt Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠINVALID _ TYPE Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinternal Ġvar Ġinitial X : ĠFloat Ġ= Ġ- 1 f ĊĠĠĠĠĠĠĠ Ġinternal Ġvar Ġinitial Y : ĠFloat Ġ= Ġ- 1 f ĊĊĠĠĠĠĠĠĠ Ġvar Ġposition Ġ= ĠNO _ POSITION ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Ġset ĊĠĠĠĠĠĠĠ Ġvar ĠitemId Ġ= ĠNO _ ID ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Ġset ĊĠĠĠĠĠĠĠ Ġvar ĠitemView Type Ġ= ĠINVALID _ TYPE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Ġset ĊĠĠĠĠĠĠĠ Ġinternal Ġvar Ġm Is Dirty Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitial X Ġ= ĠitemView . x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Y Ġ= ĠitemView . y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġre Adjust View () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . clear Animation () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . x Ġ= Ġinitial X ĊĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . y Ġ= Ġinitial Y ĊĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . rotation Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . tag Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . request Layout () ĊĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġpublic Ġfun Ġselect Top () Ġ{ ĊĠĠĠĠĠĠĠ Ġ( getLast View (). tag Ġas ? ĠF ling Card Listener )?. select Top () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun Ġselect Bottom () Ġ{ ĊĠĠĠĠĠĠĠ Ġ( getLast View (). tag Ġas ? ĠF ling Card Listener )?. select Bottom () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun Ġselect Right () Ġ{ ĊĠĠĠĠĠĠĠ Ġ( getLast View (). tag Ġas ? ĠF ling Card Listener )?. select Right Middle () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun Ġselect Left () Ġ{ ĊĠĠĠĠĠĠĠ Ġ( getLast View (). tag Ġas ? ĠF ling Card Listener )?. select Left Middle () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġget Real Current Position (): ĠInt Ġ= Ġcurrent Visible Position ĊĠĠĠ Ġprivate Ġfun Ġget Exit ing Position (): ĠInt Ġ= Ġcurrent Visible Position Ġ+ Ġ 1 ĊĊĠĠĠ Ġpublic Ġfun Ġnotify Item Inserted ( inserted Index : ĠInt , Ġdirection : ĠInt Ġ= ĠDI RECTION _ NONE ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( root Frame Layout . child Count Ġ>= Ġget View PoolSize ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview ToBe Removed Ġ= Ġroot Frame Layout . getChild At ( 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( view ToBe Removed Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadjust View Margins ( view ToBe Removed ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġattached Views By Position . size ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġattached Views By Position . key At ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġget Ġthe Ġobject Ġby Ġthe Ġkey . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattached Views By Position . get ( key )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . itemId Ġ== Ġview ToBe Removed . id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove And Re cycle View ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcreated ViewHolder Ġ= Ġcreate ViewHolder ( root Frame Layout ) ĊĠĠĠĠĠĠĠ Ġcreated ViewHolder . item View . layout Params Ġ= Ġcreate Default LayoutParams () ĊĊĠĠĠĠĠĠĠ Ġcreated ViewHolder . item View . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreated ViewHolder . itemId Ġ= Ġcreated ViewHolder . item View . id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattached Views By Position . append ( created ViewHolder . itemId , Ġcreated ViewHolder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Views Position Ġ= ĠgetItem Count () Ġ- Ġroot Frame Layout . child Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Visible Position ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon BindView ( created ViewHolder , Ġget Real Current Position ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Views Position -- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattach Touch Listener To Last View () ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( direction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDI RECTION _ TOP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanimate Back From Top ( created ViewHolder ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDI RECTION _ BOTTOM Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanimate Back From Bottom ( created ViewHolder ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDI RECTION _ LEFT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanimate Back From Left ( created ViewHolder ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDI RECTION _ RIGHT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanimate Back From Right ( created ViewHolder ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDI RECTION _ NONE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfl ing Enter Listener ?. on Card Entered ( created ViewHolder . item View , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreated ViewHolder . initial X , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreated ViewHolder . initial Y , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Exit ing Position ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcreated ViewHolder . item View . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠ Ġroot Frame Layout . addView ( created ViewHolder . item View ) ĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġanimate Back From Top ( created ViewHolder : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcreated ViewHolder . item View . y Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreated ViewHolder . item View . y Ġ- Ġcreated ViewHolder . item View . dip ( 6 0 ) ĊĠĠĠĠĠĠĠ Ġcreated ViewHolder . item View . animate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Duration ( 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Interpolator ( De cel erate Interpolator ( 0 . 5 f )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. x ( created ViewHolder . initial X ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. y ( created ViewHolder . initial Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Listener ( object Ġ: ĠAn imator Listener Adapter () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation End ( animation : ĠAn imator ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}); ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġanimate Back From Bottom ( created ViewHolder : ĠT ) Ġ{ ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġanimate Back From Left ( created ViewHolder : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcreated ViewHolder . item View . x Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreated ViewHolder . item View . x Ġ- Ġ( created ViewHolder . item View . width Ġ* Ġ 1 . 5 ). toInt () ĊĊĠĠĠĠĠĠĠ Ġcreated ViewHolder . item View . rotation Ġ= Ġ- 4 5 f ĊĊĠĠĠĠĠĠĠ Ġcreated ViewHolder . item View . animate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Duration ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. x By (- created ViewHolder . item View . width Ġ* Ġ 1 . 5 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. rotation (- 4 5 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Listener ( object Ġ: ĠAn imator Listener Adapter () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation End ( animation : ĠAn imator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreated ViewHolder . item View . request Layout () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreated ViewHolder . item View . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. start () ĊĊĠĠĠĠĠĠĠ Ġcreated ViewHolder . item View . animate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Duration ( 2 5 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Interpolator ( De cel erate Interpolator ( 0 . 5 f )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. x ( created ViewHolder . initial X ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. y ( created ViewHolder . initial Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. rotation ( 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Listener ( object Ġ: ĠAn imator Listener Adapter () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation Start ( animation : ĠAn imator ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreated ViewHolder . item View . request Layout () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation End ( animation : ĠAn imator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreated ViewHolder . item View . request Layout () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. start () ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġanimate Back From Right ( created ViewHolder : ĠT ) Ġ{ ĊĊĠĠĠ Ġ} Ċ Ċ } Ċ