package Ġcom . github . n uk c . recycler adapter Ċ Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . annotation . Layout Res Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ Ċ private Ġinterface ĠProvider < T , ĠV H Ġ: ĠRecyclerView . ViewHolder > Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġthe Ġview Ġtype Ġof Ġthe Ġitem Ġat Ġ< code > position </ code > Ġfor Ġthe Ġpurposes ĊĠĠĠĠ Ġ* Ġof Ġview Ġre cycl ing . ĊĠĠĠĠ Ġ* Ġ< p > The Ġdefault Ġimplementation Ġof Ġthis Ġmethod Ġreturns Ġ 0 , Ġmaking Ġthe Ġassumption Ġof ĊĠĠĠĠ Ġ* Ġa Ġsingle Ġview Ġtype Ġfor Ġthe Ġadapter . ĠUn like ĠListView Ġadapters , Ġtypes Ġneed Ġnot ĊĠĠĠĠ Ġ* Ġbe Ġcontiguous . ĠConsider Ġusing Ġid Ġresources Ġto Ġuniquely Ġidentify Ġitem Ġview Ġtypes . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see ĠRe cycler Adapter . getItem ViewType ĊĠĠĠĠ Ġ* Ġ@ return Ġinteger Ġvalue Ġidentifying Ġthe Ġtype Ġof Ġthe Ġview Ġneeded Ġto Ġrepresent Ġthe Ġitem Ġof ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠ Ġthe Ġprovider . ĠType Ġcodes Ġneed Ġnot Ġbe Ġcontiguous . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Layout Res ĊĠĠĠ Ġfun Ġget Layout Res Id (): ĠInt ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSame Ġas Ġget Layout Res Id () ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see ĠRe cycler Adapter . getItem ViewType ĊĠĠĠĠ Ġ* Ġ@ param Ġposition Ġposition Ġto Ġquery ĊĠĠĠĠ Ġ* Ġ@ param Ġdata Ġwithin Ġthe ĠRe cycler Adapter 's Ġitems Ġdata Ġset Ġto Ġquery ĊĠĠĠĠ Ġ* Ġ@ return Ġinteger Ġvalue Ġidentifying Ġthe Ġtype Ġof Ġthe Ġview Ġneeded Ġto Ġrepresent Ġthe Ġitem Ġat ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠ Ġ< code > position </ code >. ĠType Ġcodes Ġneed Ġnot Ġbe Ġcontiguous . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Layout Res ĊĠĠĠ Ġfun Ġget Layout Res Id ( position : ĠInt , Ġdata : ĠT ): ĠInt Ġ= Ġ- 1 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġwhen ĠRecyclerView Ġneeds Ġa Ġnew Ġ{@ link ĠViewHolder } Ġof Ġthe Ġgiven Ġtype Ġto Ġrepresent ĊĠĠĠĠ Ġ* Ġan Ġitem . ĊĠĠĠĠ Ġ* Ġ< p > ĊĠĠĠĠ Ġ* ĠThis Ġnew ĠViewHolder Ġshould Ġbe Ġconstructed Ġwith Ġa Ġnew ĠView Ġthat Ġcan Ġrepresent Ġthe Ġitems ĊĠĠĠĠ Ġ* Ġof Ġthe Ġgiven Ġtype . ĠYou Ġcan Ġeither Ġcreate Ġa Ġnew ĠView Ġmanually Ġor Ġinf late Ġit Ġfrom Ġan ĠXML ĊĠĠĠĠ Ġ* Ġlayout Ġfile . ĊĠĠĠĠ Ġ* Ġ< p > ĊĠĠĠĠ Ġ* ĠThe Ġnew ĠViewHolder Ġwill Ġbe Ġused Ġto Ġdisplay Ġitems Ġof Ġthe Ġadapter Ġusing ĊĠĠĠĠ Ġ* Ġ{@ link Ġ# on Bind ViewHolder ( ViewHolder , Ġint , ĠList )}. ĠSince Ġit Ġwill Ġbe Ġre - used Ġto Ġdisplay ĊĠĠĠĠ Ġ* Ġdifferent Ġitems Ġin Ġthe Ġdata Ġset , Ġit Ġis Ġa Ġgood Ġidea Ġto Ġcache Ġreferences Ġto Ġsub Ġviews Ġof ĊĠĠĠĠ Ġ* Ġthe ĠView Ġto Ġavoid Ġunnecessary Ġ{@ link ĠView # findViewById ( int )} Ġcalls . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġparent ĠThe ĠViewGroup Ġinto Ġwhich Ġthe Ġnew ĠView Ġwill Ġbe Ġadded Ġafter Ġit Ġis Ġbound Ġto ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġan Ġadapter Ġposition . ĊĠĠĠĠ Ġ* Ġ@ param Ġview Type ĠThe Ġview Ġtype Ġof Ġthe Ġnew ĠView . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠA Ġnew ĠViewHolder Ġthat Ġholds Ġa ĠView Ġof Ġthe Ġgiven Ġview Ġtype . ĊĠĠĠĠ Ġ* Ġ@ see Ġget Layout Res Id Ġor ĊĠĠĠĠ Ġ* Ġ@ see Ġget Layout Res Id ( Int , ĠT ) ĊĠĠĠĠ Ġ* Ġ@ see Ġbind ( ViewHolder , Ġint ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠV H ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġby ĠRecyclerView Ġto Ġdisplay Ġthe Ġdata Ġat Ġthe Ġspecified Ġposition . ĠThis Ġmethod ĊĠĠĠĠ Ġ* Ġshould Ġupdate Ġthe Ġcontents Ġof Ġthe Ġ{@ link ĠViewHolder # item View } Ġto Ġreflect Ġthe Ġitem Ġat ĊĠĠĠĠ Ġ* Ġthe Ġgiven Ġposition . ĊĠĠĠĠ Ġ* Ġ< p > ĊĠĠĠĠ Ġ* ĠNote Ġthat Ġun like Ġ{@ link Ġandroid . widget . ListView }, ĠRecyclerView Ġwill Ġnot Ġcall Ġthis Ġmethod ĊĠĠĠĠ Ġ* Ġagain Ġif Ġthe Ġposition Ġof Ġthe Ġitem Ġchanges Ġin Ġthe Ġdata Ġset Ġunless Ġthe Ġitem Ġitself Ġis ĊĠĠĠĠ Ġ* Ġinvalid ated Ġor Ġthe Ġnew Ġposition Ġcannot Ġbe Ġdetermined . ĠFor Ġthis Ġreason , Ġyou Ġshould Ġonly ĊĠĠĠĠ Ġ* Ġuse Ġthe Ġ< code > position </ code > Ġparameter Ġwhile Ġac qu iring Ġthe Ġrelated Ġdata Ġitem Ġinside ĊĠĠĠĠ Ġ* Ġthis Ġmethod Ġand Ġshould Ġnot Ġkeep Ġa Ġcopy Ġof Ġit . ĠIf Ġyou Ġneed Ġthe Ġposition Ġof Ġan Ġitem Ġlater ĊĠĠĠĠ Ġ* Ġon Ġ( e . g . Ġin Ġa Ġclick Ġlistener ), Ġuse Ġ{@ link ĠViewHolder # get Adapter Position ()} Ġwhich Ġwill ĊĠĠĠĠ Ġ* Ġhave Ġthe Ġupdated Ġadapter Ġposition . ĊĠĠĠĠ Ġ* Ġ< p > ĊĠĠĠĠ Ġ* ĠPartial Ġbind Ġvs Ġfull Ġbind : ĊĠĠĠĠ Ġ* Ġ< p > ĊĠĠĠĠ Ġ* ĠThe Ġpayload s Ġparameter Ġis Ġa Ġmerge Ġlist Ġfrom Ġ{@ link Ġ# notify Item Changed ( int , ĠObject )} Ġor ĊĠĠĠĠ Ġ* Ġ{@ link Ġ# notify Item Range Changed ( int , Ġint , ĠObject )}. Ġ ĠIf Ġthe Ġpayload s Ġlist Ġis Ġnot Ġempty , ĊĠĠĠĠ Ġ* Ġthe ĠViewHolder Ġis Ġcurrently Ġbound Ġto Ġold Ġdata Ġand ĠAdapter Ġmay Ġrun Ġan Ġefficient Ġpartial ĊĠĠĠĠ Ġ* Ġupdate Ġusing Ġthe Ġpayload Ġinfo . Ġ ĠIf Ġthe Ġpayload Ġis Ġempty , Ġ ĠAdapter Ġmust Ġrun Ġa Ġfull Ġbind . ĊĠĠĠĠ Ġ* ĠAdapter Ġshould Ġnot Ġassume Ġthat Ġthe Ġpayload Ġpassed Ġin Ġnotify Ġmethods Ġwill Ġbe Ġreceived Ġby ĊĠĠĠĠ Ġ* Ġon Bind ViewHolder (). Ġ ĠFor Ġexample Ġwhen Ġthe Ġview Ġis Ġnot Ġattached Ġto Ġthe Ġscreen , Ġthe ĊĠĠĠĠ Ġ* Ġpayload Ġin Ġnotify Item Change () Ġwill Ġbe Ġsimply Ġdropped . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġholder ĠThe ĠViewHolder Ġwhich Ġshould Ġbe Ġupdated Ġto Ġrepresent Ġthe Ġcontents Ġof Ġthe ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Ġat Ġthe Ġgiven Ġposition Ġin Ġthe Ġdata Ġset . ĊĠĠĠĠ Ġ* Ġ@ param Ġdata ĠThe Ġdata Ġof Ġthe Ġitem Ġwithin Ġthe Ġadapter 's Ġdata Ġset . ĊĠĠĠĠ Ġ* Ġ@ param Ġpayload s ĠA Ġnon - null Ġlist Ġof Ġmerged Ġpayload s . ĠCan Ġbe Ġempty Ġlist Ġif Ġrequires Ġfull ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġbind ( holder : ĠV H , Ġdata : ĠT , Ġpayload s : ĠList < Any >) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġthe Ġstable ĠID Ġfor Ġthe Ġitem Ġat Ġ< code > position </ code >. ĠIf Ġ{@ link Ġ# has Stable Ids ()} ĊĠĠĠĠ Ġ* Ġwould Ġreturn Ġfalse Ġthis Ġmethod Ġshould Ġreturn Ġ{@ link Ġ# NO _ ID }. ĠThe Ġdefault Ġimplementation ĊĠĠĠĠ Ġ* Ġof Ġthis Ġmethod Ġreturns Ġ{@ link Ġ# NO _ ID }. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠgetItem Id ( position : ĠInt ): ĠLong Ġ= Ġposition . to Long () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġby Ġthe ĠRecyclerView Ġif Ġa ĠViewHolder Ġcreated Ġby Ġthis ĠAdapter Ġcannot Ġbe Ġre cyc led ĊĠĠĠĠ Ġ* Ġdue Ġto Ġits Ġtransient Ġstate . ĠUp on Ġreceiving Ġthis Ġcallback , ĠAdapter Ġcan Ġclear Ġthe ĊĠĠĠĠ Ġ* Ġanimation ( s ) Ġthat Ġeffect Ġthe ĠView 's Ġtransient Ġstate Ġand Ġreturn Ġ< code > true </ code > Ġso Ġthat ĊĠĠĠĠ Ġ* Ġthe ĠView Ġcan Ġbe Ġre cyc led . ĠKeep Ġin Ġmind Ġthat Ġthe ĠView Ġin Ġquestion Ġis Ġalready Ġremoved Ġfrom ĊĠĠĠĠ Ġ* Ġthe ĠRecyclerView . ĊĠĠĠĠ Ġ* Ġ< p > ĊĠĠĠĠ Ġ* ĠIn Ġsome Ġcases , Ġit Ġis Ġacceptable Ġto Ġre cycle Ġa ĠView Ġalthough Ġit Ġhas Ġtransient Ġstate . ĠMost ĊĠĠĠĠ Ġ* Ġof Ġthe Ġtime , Ġthis Ġis Ġa Ġcase Ġwhere Ġthe Ġtransient Ġstate Ġwill Ġbe Ġcleared Ġin ĊĠĠĠĠ Ġ* Ġ{@ link Ġ# on Bind ViewHolder ( ViewHolder , Ġint )} Ġcall Ġwhen ĠView Ġis Ġre bound Ġto Ġa Ġnew Ġposition . ĊĠĠĠĠ Ġ* ĠFor Ġthis Ġreason , ĠRecyclerView Ġleaves Ġthe Ġdecision Ġto Ġthe ĠAdapter Ġand Ġuses Ġthe Ġreturn ĊĠĠĠĠ Ġ* Ġvalue Ġof Ġthis Ġmethod Ġto Ġdecide Ġwhether Ġthe ĠView Ġshould Ġbe Ġre cyc led Ġor Ġnot . ĊĠĠĠĠ Ġ* Ġ< p > ĊĠĠĠĠ Ġ* ĠNote Ġthat Ġwhen Ġall Ġanimations Ġare Ġcreated Ġby Ġ{@ link ĠRecyclerView . Item Animator }, Ġyou ĊĠĠĠĠ Ġ* Ġshould Ġnever Ġreceive Ġthis Ġcallback Ġbecause ĠRecyclerView Ġkeeps Ġthose ĠViews Ġas Ġchildren ĊĠĠĠĠ Ġ* Ġuntil Ġtheir Ġanimations Ġare Ġcomplete . ĠThis Ġcallback Ġis Ġuseful Ġwhen Ġchildren Ġof Ġthe Ġitem ĊĠĠĠĠ Ġ* Ġviews Ġcreate Ġanimations Ġwhich Ġmay Ġnot Ġbe Ġeasy Ġto Ġimplement Ġusing Ġan Ġ{@ link ĠItem Animator }. ĊĠĠĠĠ Ġ* Ġ< p > ĊĠĠĠĠ Ġ* ĠYou Ġshould Ġ< em > never </ em > Ġfix Ġthis Ġissue Ġby Ġcalling ĊĠĠĠĠ Ġ* Ġ< code > holder . item View . set Has Transient State ( false );</ code > Ġunless Ġyou 've Ġpreviously Ġcalled ĊĠĠĠĠ Ġ* Ġ< code > holder . item View . set Has Transient State ( true );</ code >. ĠEach ĊĠĠĠĠ Ġ* Ġ< code > View . set Has Transient State ( true )</ code > Ġcall Ġmust Ġbe Ġmatched Ġby Ġa ĊĠĠĠĠ Ġ* Ġ< code > View . set Has Transient State ( false )</ code > Ġcall , Ġotherwise , Ġthe Ġstate Ġof Ġthe ĠView ĊĠĠĠĠ Ġ* Ġmay Ġbecome Ġinconsistent . ĠYou Ġshould Ġalways Ġprefer Ġto Ġend Ġor Ġcancel Ġanimations Ġthat Ġare ĊĠĠĠĠ Ġ* Ġtriggering Ġthe Ġtransient Ġstate Ġinstead Ġof Ġhandling Ġit Ġmanually . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġholder ĠThe ĠViewHolder Ġcontaining Ġthe ĠView Ġthat Ġcould Ġnot Ġbe Ġre cyc led Ġdue Ġto Ġits ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransient Ġstate . ĊĠĠĠĠ Ġ* Ġ@ return ĠTrue Ġif Ġthe ĠView Ġshould Ġbe Ġre cyc led , Ġfalse Ġotherwise . ĠNote Ġthat Ġif Ġthis Ġmethod ĊĠĠĠĠ Ġ* Ġreturns Ġ< code > true </ code >, ĠRecyclerView Ġ< em > will Ġignore </ em > Ġthe Ġtransient Ġstate Ġof ĊĠĠĠĠ Ġ* Ġthe ĠView Ġand Ġre cycle Ġit Ġregardless . ĠIf Ġthis Ġmethod Ġreturns Ġ< code > false </ code >, ĊĠĠĠĠ Ġ* ĠRecyclerView Ġwill Ġcheck Ġthe ĠView 's Ġtransient Ġstate Ġagain Ġbefore Ġgiving Ġa Ġfinal Ġdecision . ĊĠĠĠĠ Ġ* ĠDefault Ġimplementation Ġreturns Ġfalse . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġon Failed To Re cycle View ( holder : ĠV H ): ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġwhen Ġa Ġview Ġcreated Ġby Ġthis Ġadapter Ġhas Ġbeen Ġre cyc led . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ< p > A Ġview Ġis Ġre cyc led Ġwhen Ġa Ġ{@ link ĠLayout Manager } Ġdec ides Ġthat Ġit Ġno Ġlonger ĊĠĠĠĠ Ġ* Ġneeds Ġto Ġbe Ġattached Ġto Ġits Ġparent Ġ{@ link ĠRecyclerView }. ĠThis Ġcan Ġbe Ġbecause Ġit Ġhas ĊĠĠĠĠ Ġ* Ġf allen Ġout Ġof Ġvisibility Ġor Ġa Ġset Ġof Ġcached Ġviews Ġrepresented Ġby Ġviews Ġstill ĊĠĠĠĠ Ġ* Ġattached Ġto Ġthe Ġparent ĠRecyclerView . ĠIf Ġan Ġitem Ġview Ġhas Ġlarge Ġor Ġexpensive Ġdata ĊĠĠĠĠ Ġ* Ġbound Ġto Ġit Ġsuch Ġas Ġlarge Ġbit maps , Ġthis Ġmay Ġbe Ġa Ġgood Ġplace Ġto Ġrelease Ġthose ĊĠĠĠĠ Ġ* Ġresources .</ p > ĊĠĠĠĠ Ġ* Ġ< p > ĊĠĠĠĠ Ġ* ĠRecyclerView Ġcalls Ġthis Ġmethod Ġright Ġbefore Ġclearing ĠViewHolder 's Ġinternal Ġdata Ġand ĊĠĠĠĠ Ġ* Ġsending Ġit Ġto ĠRe cyc led View Pool . ĠThis Ġway , Ġif ĠViewHolder Ġwas Ġholding Ġvalid Ġinformation ĊĠĠĠĠ Ġ* Ġbefore Ġbeing Ġre cyc led , Ġyou Ġcan Ġcall Ġ{@ link ĠViewHolder # get Adapter Position ()} Ġto Ġget ĊĠĠĠĠ Ġ* Ġits Ġadapter Ġposition . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġholder ĠThe ĠViewHolder Ġfor Ġthe Ġview Ġbeing Ġre cyc led ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġon View Re cyc led ( holder : ĠV H ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġwhen Ġa Ġview Ġcreated Ġby Ġthis Ġadapter Ġhas Ġbeen Ġattached Ġto Ġa Ġwindow . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ< p > This Ġcan Ġbe Ġused Ġas Ġa Ġreasonable Ġsignal Ġthat Ġthe Ġview Ġis Ġabout Ġto Ġbe Ġseen ĊĠĠĠĠ Ġ* Ġby Ġthe Ġuser . ĠIf Ġthe Ġadapter Ġpreviously Ġfreed Ġany Ġresources Ġin ĊĠĠĠĠ Ġ* Ġ{@ link Ġ# on View Detached From Window ( RecyclerView . ViewHolder ) Ġon View Detached From Window } ĊĠĠĠĠ Ġ* Ġthose Ġresources Ġshould Ġbe Ġrestored Ġhere .</ p > ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġholder ĠH older Ġof Ġthe Ġview Ġbeing Ġattached ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġon View Attached To Window ( holder : ĠV H ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġwhen Ġa Ġview Ġcreated Ġby Ġthis Ġadapter Ġhas Ġbeen Ġdet ached Ġfrom Ġits Ġwindow . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ< p > Be coming Ġdet ached Ġfrom Ġthe Ġwindow Ġis Ġnot Ġnecessarily Ġa Ġpermanent Ġcondition ; ĊĠĠĠĠ Ġ* Ġthe Ġconsumer Ġof Ġan ĠAdapter 's Ġviews Ġmay Ġchoose Ġto Ġcache Ġviews Ġoff screen Ġwhile Ġthey ĊĠĠĠĠ Ġ* Ġare Ġnot Ġvisible , Ġatt aching Ġand Ġdet aching Ġthem Ġas Ġappropriate .</ p > ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġholder ĠH older Ġof Ġthe Ġview Ġbeing Ġdet ached ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġon View Detached From Window ( holder : ĠV H ) Ċ } Ċ Ċ abstract Ġclass ĠBase Provider < T Ġ: ĠAny , ĠV H Ġ: ĠRecyclerView . ViewHolder >( val Ġtype : ĠClass <* >) Ġ: ĠProvider < T , ĠV H >