/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠK a ush ik ĠN . ĠSan ji Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . mind ork s . ka ush ik ns an ji . instagram . demo . utils . widget Ċ Ċ import Ġandroidx . recyclerview . widget .* Ċ Ċ /** Ċ Ġ* ĠKotlin Ġfile Ġfor Ġextension Ġfunctions Ġon Ġ` RecyclerView `. Ċ Ġ* Ċ Ġ* Ġ@ author ĠK a ush ik ĠN ĠSan ji Ċ Ġ*/ Ċ Ċ // ĠDefault Ġconstant Ġused Ġin ĠSpan ĠCount Ġdetermin ation Ċ private Ġconst Ġval ĠZERO _ SPAN _ COUNT Ġ= Ġ 0 Ċ Ċ // ĠDefault Ġconstant Ġused Ġin ĠOrientation Ġdetermin ation Ċ private Ġconst Ġval ĠINVALID _ OR IENTATION Ġ= Ġ- 1 Ċ Ċ /** Ċ Ġ* ĠCast s Ġthe Ġreceiver 's Ġ[ RecyclerView . LayoutManager ] Ġto Ġ[ Linear LayoutManager ] Ġand Ġreturns Ġthe Ġsame . Ċ Ġ* Ċ Ġ* Ġ@ throws Ġ[ Class CastException ] Ġif Ġ[ RecyclerView . LayoutManager ] Ġis ĠNOT Ġ[ Linear LayoutManager ]. Ċ Ġ*/ Ċ @ Throws ( Class CastException :: class ) Ċ fun ĠRecyclerView . get Linear LayoutManager (): ĠLinearLayoutManager Ġ= ĊĠĠĠ Ġthis . layout Manager Ġas ĠLinearLayoutManager Ċ Ċ /** Ċ Ġ* ĠCast s Ġthe Ġreceiver 's Ġ[ RecyclerView . LayoutManager ] Ġto Ġ[ Grid LayoutManager ] Ġand Ġreturns Ġthe Ġsame . Ċ Ġ* Ċ Ġ* Ġ@ throws Ġ[ Class CastException ] Ġif Ġ[ RecyclerView . LayoutManager ] Ġis ĠNOT Ġ[ Grid LayoutManager ]. Ċ Ġ*/ Ċ @ Throws ( Class CastException :: class ) Ċ fun ĠRecyclerView . get Grid LayoutManager (): ĠGrid LayoutManager Ġ= ĊĠĠĠ Ġthis . layout Manager Ġas ĠGrid LayoutManager Ċ Ċ /** Ċ Ġ* ĠCast s Ġthe Ġreceiver 's Ġ[ RecyclerView . LayoutManager ] Ġto Ġ[ St agger ed Grid LayoutManager ] Ġand Ġreturns Ġthe Ġsame . Ċ Ġ* Ċ Ġ* Ġ@ throws Ġ[ Class CastException ] Ġif Ġ[ RecyclerView . LayoutManager ] Ġis ĠNOT Ġ[ St agger ed Grid LayoutManager ]. Ċ Ġ*/ Ċ @ Throws ( Class CastException :: class ) Ċ fun ĠRecyclerView . get St agger ed Grid LayoutManager (): ĠSt agger ed Grid LayoutManager Ġ= ĊĠĠĠ Ġthis . layout Manager Ġas ĠSt agger ed Grid LayoutManager Ċ Ċ /** Ċ Ġ* ĠCast s Ġthe Ġreceiver 's Ġ[ RecyclerView . LayoutManager ] Ġto Ġ[ Linear LayoutManager ] Ġand Ġreturns Ġthe Ġsame . Ċ Ġ* ĠIf Ġnot Ġ[ Linear LayoutManager ], Ġthen Ġit Ġreturns Ġ` null `. Ċ Ġ*/ Ċ fun ĠRecyclerView . get Linear LayoutManager OrNull (): ĠLinearLayoutManager ? Ġ= ĊĠĠĠ Ġthis . layout Manager Ġas ? ĠLinearLayoutManager Ċ Ċ /** Ċ Ġ* ĠCast s Ġthe Ġreceiver 's Ġ[ RecyclerView . LayoutManager ] Ġto Ġ[ Grid LayoutManager ] Ġand Ġreturns Ġthe Ġsame . Ċ Ġ* ĠIf Ġnot Ġ[ Grid LayoutManager ], Ġthen Ġit Ġreturns Ġ` null `. Ċ Ġ*/ Ċ fun ĠRecyclerView . get Grid LayoutManager OrNull (): ĠGrid LayoutManager ? Ġ= ĊĠĠĠ Ġthis . layout Manager Ġas ? ĠGrid LayoutManager Ċ Ċ /** Ċ Ġ* ĠCast s Ġthe Ġreceiver 's Ġ[ RecyclerView . LayoutManager ] Ġto Ġ[ St agger ed Grid LayoutManager ] Ġand Ġreturns Ġthe Ġsame . Ċ Ġ* ĠIf Ġnot Ġ[ St agger ed Grid LayoutManager ], Ġthen Ġit Ġreturns Ġ` null `. Ċ Ġ*/ Ċ fun ĠRecyclerView . get St agger ed Grid LayoutManager OrNull (): ĠSt agger ed Grid LayoutManager ? Ġ= ĊĠĠĠ Ġthis . layout Manager Ġas ? ĠSt agger ed Grid LayoutManager Ċ Ċ /** Ċ Ġ* ĠRetrieves Ġand Ġreturns Ġthe Ġ` Span Count ` Ġfrom Ġthe Ġreceiver 's Ġ[ RecyclerView . LayoutManager ]. Ċ Ġ* ĠIt Ġcycles Ġthrough Ġboth ĠGrid Ġlayout Ġmanagers , Ġi . e ., Ġ[ Grid LayoutManager ] Ġand Ċ Ġ* Ġ[ St agger ed Grid LayoutManager ] Ġin Ġthe Ġorder , Ġto Ġread Ġthe Ġ` Span Count `. ĠIf Ġit Ġfails Ġin Ġboth Ġthe Ġcases , Ċ Ġ* Ġthen Ġthe Ġvalue Ġpassed Ġas Ġ[ default ] Ġwill Ġbe Ġreturned . Ċ Ġ* Ċ Ġ* Ġ@ param Ġdefault ĠThe Ġdefault Ġ[ Int ] Ġvalue Ġof Ġthe Ġ` Span Count ` Ġto Ġbe Ġreturned Ġin Ġcase Ġof Ġfailure . Ċ Ġ*/ Ċ fun ĠRecyclerView . get Span Count ( default : ĠInt Ġ= ĠZERO _ SPAN _ COUNT ): ĠInt Ġ= ĊĠĠĠ Ġget Grid LayoutManager OrNull ()?. span Count ĊĠĠĠĠĠĠĠ Ġ?: Ġget St agger ed Grid LayoutManager OrNull ()?. span Count ĊĠĠĠĠĠĠĠ Ġ?: Ġdefault Ċ Ċ /** Ċ Ġ* ĠRetrieves Ġand Ġreturns Ġthe Ġ` Orientation ` Ġfrom Ġthe Ġreceiver 's Ġ[ RecyclerView . LayoutManager ]. Ċ Ġ* ĠIt Ġcycles Ġthrough Ġall Ġthe Ġlayout Ġmanagers , Ġi . e ., Ġ[ Linear LayoutManager ], Ġ[ Grid LayoutManager ] Ċ Ġ* Ġand Ġ[ St agger ed Grid LayoutManager ] Ġin Ġthe Ġorder , Ġto Ġread Ġthe Ġ` Orientation `. ĠIf Ġit Ġfails Ġin Ġall Ġcases , Ċ Ġ* Ġthen Ġthe Ġvalue Ġpassed Ġas Ġ[ default ] Ġwill Ġbe Ġreturned . Ċ Ġ* Ċ Ġ* Ġ@ param Ġdefault ĠThe Ġdefault Ġ[ Int ] Ġvalue Ġof Ġthe Ġ` Orientation ` Ġto Ġbe Ġreturned Ġin Ġcase Ġof Ġfailure . Ċ Ġ*/ Ċ fun ĠRecyclerView . get Orientation ( default : ĠInt Ġ= ĠINVALID _ OR IENTATION ): ĠInt Ġ= ĊĠĠĠ Ġget Linear LayoutManager OrNull ()?. orientation ĊĠĠĠĠĠĠĠ Ġ?: Ġget Grid LayoutManager OrNull ()?. orientation ĊĠĠĠĠĠĠĠ Ġ?: Ġget St agger ed Grid LayoutManager OrNull ()?. orientation ĊĠĠĠĠĠĠĠ Ġ?: Ġdefault Ċ Ċ /** Ċ Ġ* ĠReturns Ġ` true ` Ġif Ġthe Ġ` Orientation ` Ġfrom Ġthe Ġ[ receiver ][ RecyclerView ] Ċ Ġ* Ġis Ġ[ RecyclerView . VERTICAL ]; Ġ` false ` Ġotherwise . Ċ Ġ*/ Ċ fun ĠRecyclerView . is Orientation Vertical (): ĠBoolean Ġ= ĊĠĠĠ Ġget Orientation () Ġ== ĠRecyclerView . VERTICAL Ċ Ċ /** Ċ Ġ* ĠReturns Ġ` true ` Ġif Ġthe Ġ` Orientation ` Ġfrom Ġthe Ġ[ receiver ][ RecyclerView ] Ċ Ġ* Ġis Ġ[ RecyclerView . HORIZONTAL ]; Ġ` false ` Ġotherwise . Ċ Ġ*/ Ċ fun ĠRecyclerView . is Orientation Horizontal (): ĠBoolean Ġ= ĊĠĠĠ Ġget Orientation () Ġ== ĠRecyclerView . HORIZONTAL Ċ Ċ /** Ċ Ġ* ĠExtension Ġfunction Ġon Ġ[ RecyclerView ] Ġfor Ġsmooth ly Ġscrolling Ġto Ġthe Ġgiven Ġ[ target Position ] Ġin Ġa Ċ Ġ* Ġvert ically Ġorient ed Ġ[ RecyclerView ] Ġsuch Ġthat Ġthe Ġcorresponding Ġitem Ġgets Ġproperly Ġdisplayed Ċ Ġ* Ġand Ġaligned Ġwith Ġthe Ġtop Ġedge Ġof Ġthe Ġparent Ġ[ RecyclerView ]. Ċ Ġ*/ Ċ fun ĠRecyclerView . smooth V Scroll To Position With View Top ( target Position : ĠInt ) Ġ{ ĊĠĠĠ Ġ// ĠCheck Ġif Ġthe Ġorientation Ġis Ġvertical Ġbefore Ġproceed ing ĊĠĠĠ Ġif Ġ( is Orientation Vertical ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠConfigure Ġcustom ĠLinear Smooth Scroller Ġin Ġorder Ġto Ġalign ĊĠĠĠĠĠĠĠ Ġ// Ġthe Ġtop Ġof Ġthe Ġchild Ġwith Ġthe Ġparent ĠRecyclerView Ġtop Ġalways ĊĠĠĠĠĠĠĠ Ġval Ġlinear Smooth Scroller : ĠLinear Smooth Scroller Ġ= Ġobject Ġ: ĠLinear Smooth Scroller ( context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠWhen Ġscrolling Ġtowards Ġa Ġchild Ġview , Ġthis Ġmethod Ġdefines Ġwhether Ġwe Ġshould Ġalign Ġthe Ġtop ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġor Ġthe Ġbottom Ġedge Ġof Ġthe Ġchild Ġwith Ġthe Ġparent ĠRecyclerView . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĠS NAP _ TO _ START , ĠS NAP _ TO _ END Ġor ĠS NAP _ TO _ ANY ; Ġdepending Ġon Ġthe Ġcurrent Ġtarget Ġvector ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Vertical Snap Preference (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠS NAP _ TO _ START ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠSet Ġthe Ġtarget Ġposition Ġto Ġscroll Ġto ĊĠĠĠĠĠĠĠ Ġlinear Smooth Scroller . target Position Ġ= Ġtarget Position ĊĠĠĠĠĠĠĠ Ġ// ĠBegin ĠSm ooth Ġscroll Ġwith Ġthe Ġsc roller Ġbuilt ĊĠĠĠĠĠĠĠ Ġlayout Manager ?. start Smooth Scroll ( linear Smooth Scroller ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠExtension Ġfunction Ġon Ġ[ RecyclerView ] Ġbuilt Ġwith Ġ[ Linear LayoutManager ]/ [ Grid LayoutManager ] Ċ Ġ* Ġto Ġretrieve Ġthe ĠItem Ġposition Ġof Ġthe Ġfirst Ġcompletely Ġvisible Ġor Ġpartially Ġvisible Ċ Ġ* ĠItem Ġon Ġthe Ġscreen . Ċ Ġ* Ċ Ġ* ĠWhile Ġdetermining Ġthe Ġposition , Ġposition Ġof Ġfirst Ġcompletely Ġvisible ĠItem Ġis Ġpriorit ized Ġover Ċ Ġ* Ġthe Ġpartially Ġvisible Ġone . Ċ Ġ* Ċ Ġ* Ġ@ return Ġ[ Int ] Ġvalue Ġof Ġthe Ġposition Ġof Ġthe Ġfirst Ġvisible ĠItem Ġon Ġthe Ġscreen . Ċ Ġ* ĠCan Ġbe Ġ[ RecyclerView . NO _ POSITION ] Ġif Ġit Ġcould Ġnot Ġbe Ġdetermined Ġor Ġif Ġthe Ġ[ RecyclerView ] Ċ Ġ* Ġis ĠNOT Ġsetup Ġwith Ġ[ Linear LayoutManager ]/ [ Grid LayoutManager ]. Ċ Ġ*/ Ċ private Ġfun ĠRecyclerView . getFirst Visible Item Position From Linear LayoutManager (): ĠInt Ġ= ĊĠĠĠ Ġget Linear LayoutManager OrNull ()?. let Ġ{ Ġlayout Manager Ġ-> ĊĠĠĠĠĠĠĠ Ġlayout Manager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. findFirst Comp let ely Visible Item Position () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. take If Ġ{ Ġit Ġ> ĠRecyclerView . NO _ POSITION Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġlayout Manager . findFirst Visible Item Position () ĊĠĠĠ Ġ} Ġ?: ĠRecyclerView . NO _ POSITION Ċ Ċ /** Ċ Ġ* ĠExtension Ġfunction Ġon Ġ[ RecyclerView ] Ġbuilt Ġwith Ġ[ St agger ed Grid LayoutManager ] Ċ Ġ* Ġto Ġretrieve Ġthe ĠItem Ġposition Ġof Ġthe Ġfirst Ġcompletely Ġvisible Ġor Ġpartially Ġvisible Ċ Ġ* ĠItem Ġon Ġthe Ġscreen . Ċ Ġ* Ċ Ġ* ĠWhile Ġdetermining Ġthe Ġposition , Ġposition Ġof Ġfirst Ġcompletely Ġvisible ĠItem Ġis Ġpriorit ized Ġover Ċ Ġ* Ġthe Ġpartially Ġvisible Ġone , Ġand Ġsince Ġthis Ġis Ġbuilt Ġwith Ġ[ St agger ed Grid LayoutManager ], Ġonly Ċ Ġ* Ġthe Ġposition Ġof Ġthe Ġfirst Ġview Ġof Ġthe ĠGrid Ġspan Ġis Ġconsidered . Ċ Ġ* Ċ Ġ* Ġ@ return Ġ[ Int ] Ġvalue Ġof Ġthe Ġposition Ġof Ġthe Ġfirst Ġvisible ĠItem Ġon Ġthe Ġscreen . Ċ Ġ* ĠCan Ġbe Ġ[ RecyclerView . NO _ POSITION ] Ġif Ġit Ġcould Ġnot Ġbe Ġdetermined Ġor Ġif Ġthe Ġ[ RecyclerView ] Ċ Ġ* Ġis ĠNOT Ġsetup Ġwith Ġ[ St agger ed Grid LayoutManager ]. Ċ Ġ*/ Ċ private Ġfun ĠRecyclerView . getFirst Visible Item Position From St agger ed Grid LayoutManager (): ĠInt Ġ= ĊĠĠĠ Ġget St agger ed Grid LayoutManager OrNull ()?. let Ġ{ Ġlayout Manager Ġ-> ĊĠĠĠĠĠĠĠ Ġlayout Manager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. findFirst Comp let ely Visible Item Positions ( null )[ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. take If Ġ{ Ġit Ġ> ĠRecyclerView . NO _ POSITION Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġlayout Manager . findFirst Visible Item Positions ( null )[ 0 ] ĊĠĠĠ Ġ} Ġ?: ĠRecyclerView . NO _ POSITION Ċ Ċ /** Ċ Ġ* ĠExtension Ġfunction Ġon Ġ[ RecyclerView ] Ġto Ġretrieve Ġthe ĠItem Ġposition Ġof Ġthe Ċ Ġ* Ġfirst Ġcompletely Ġvisible Ġor Ġpartially Ġvisible ĠItem Ġon Ġthe Ġscreen . Ċ Ġ* Ċ Ġ* ĠWhile Ġdetermining Ġthe Ġposition , Ġposition Ġof Ġfirst Ġcompletely Ġvisible ĠItem Ġis Ġpriorit ized Ġover Ċ Ġ* Ġthe Ġpartially Ġvisible Ġone . Ċ Ġ* Ċ Ġ* ĠThis Ġmethod Ġfirst Ġtries Ġto Ġretrieve Ġthe ĠItem ĠPosition Ġfrom Ġthe Ċ Ġ* Ġ[ Linear LayoutManager ]/ [ Grid LayoutManager ] Ġof Ġthe Ġ[ RecyclerView ]. ĠIf Ġthis Ġis Ċ Ġ* Ġfound Ġto Ġbe Ġ[ RecyclerView . NO _ POSITION ], Ġthen Ġit Ġwill Ġtry Ġto Ġretrieve Ċ Ġ* Ġfrom Ġ[ St agger ed Grid LayoutManager ] Ġof Ġthe Ġ[ RecyclerView ]. Ċ Ġ* Ċ Ġ* Ġ@ return Ġ[ Int ] Ġvalue Ġof Ġthe Ġposition Ġof Ġthe Ġfirst Ġvisible ĠItem Ġon Ġthe Ġscreen . Ċ Ġ* ĠCan Ġbe Ġ[ RecyclerView . NO _ POSITION ] Ġif Ġit Ġcould Ġnot Ġbe Ġdetermined Ġor Ġif Ġthe Ġ[ RecyclerView ] Ċ Ġ* Ġis ĠNOT Ġsetup Ġwith Ġ[ Linear LayoutManager ]/ [ Grid LayoutManager ]/ [ St agger ed Grid LayoutManager ], Ġi . e ., Ċ Ġ* Ġif Ġsetup Ġwith Ġa Ġ[ RecyclerView . LayoutManager ] Ġthat Ġdoes Ġnot Ġprovide Ġthis Ġinformation . Ċ Ġ*/ Ċ fun ĠRecyclerView . getFirst Visible Item Position (): ĠInt Ġ= ĊĠĠĠ Ġget First Visible Item Position From Linear LayoutManager (). take If Ġ{ Ġit Ġ> ĠRecyclerView . NO _ POSITION Ġ} ĊĠĠĠĠĠĠĠ Ġ?: Ġget First Visible Item Position From St agger ed Grid LayoutManager ()