package Ġio . code tail . air planes . global ĊĊ Ċ import Ġandroid . arch . lifecycle . Lifecycle Ċ import Ġandroid . content . Context Ċ import Ġandroid . databinding . Data Binding Util Ċ import Ġandroid . databinding . ViewData Binding Ċ import Ġandroid . support . v 7 . widget . RecyclerView Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . ViewGroup Ċ import Ġio . reactivex . Flow able Ċ Ċ /** Ċ Ġ* Ġcreated Ġat Ġ 5 / 2 0 / 1 7 ĊĊ Ġ* Ġ@ author ĠO z od ru kh Ċ Ġ* Ġ* Ċ Ġ* Ġ@ version Ġ 1 . 0 Ċ Ġ*/ Ċ class ĠBase Adapter < T , ĠVC Ġ: ĠView Data Binding >( lifecycle : ĠLifecycle , Ġdata Flow : ĠFlow able < List < T >>) ĊĠĠĠ Ġ: ĠObserver Adapter < T , ĠBase Adapter . Data Binding Holder < T , ĠVC >>( lifecycle , Ġdata Flow ) Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġlayout Inflater : ĠLayoutInflater ĊĠĠĠ Ġprivate Ġval Ġviews Map Ġ= Ġmutable Map Of < Int , ĠView Type Factory >() ĊĊĠĠĠ Ġfun Ġadd ( view Factory : ĠView Type Factory ) Ġ{ ĊĠĠĠĠĠĠĠ Ġviews Map [ view Factory . view Type ] Ġ= Ġview Factory ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Attached To RecyclerView ( parent : ĠRecyclerView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Attached To RecyclerView ( parent ) ĊĊĠĠĠĠĠĠĠ Ġlayout Inflater Ġ= Ġparent . context . getSystem Service ( Context . LAYOUT _ IN FL ATER _ SERVICE ) Ġas ĠLayoutInflater ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" unchecked _ cast ") ĊĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠData Binding Holder < T , ĠVC > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġview Factory Ġ= Ġviews Map [ view Type ] ĊĠĠĠĠĠĠĠ Ġif Ġ( view Factory Ġis ĠBinding View Factory < *, Ġ* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠData Binding Holder < T , ĠVC >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Factory . create View Component ( layout Inflater , Ġparent ) Ġas ĠVC , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Factory Ġas ĠBinding View Factory < T , ĠVC > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTODO (" support Ġother Ġview Ġtypes ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem ViewType ( position : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġitem Ġ= ĠgetItem ( position ) ĊĠĠĠĠĠĠĠ Ġviews Map . forEach Ġ{ Ġentry Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry . value . supports ( this , Ġposition , Ġitem Ġas ĠAny )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġentry . key ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" No ĠView Type Factory Ġfound Ġfor Ġ$ position ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠData Binding Holder < T , ĠVC >, Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġholder . binder . bind ( holder . view Component , ĠgetItem ( position ), Ġposition ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠData Binding Holder < T , ĠVC Ġ: ĠView Data Binding >( val Ġview Component : ĠVC , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbinder : ĠBinding View Factory < T , ĠVC >) ĊĠĠĠĠĠĠĠ Ġ: ĠRecyclerView . ViewHolder ( view Component . root ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRepresent ĠView ĠType Ġthat Ġwill Ġbe Ġshown Ġin Ġadapter . ĊĠĠĠĠ Ġ* ĠView Ġtype Ġmust Ġhave Ġunique Ġidentifier ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinterface ĠView Type Factory Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġview Type : ĠInt ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSupports ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġsupports ( adapter : ĠBase Adapter < *, Ġ* >, Ġposition : ĠInt , Ġitem : ĠAny ): ĠBoolean Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠBinding View Factory < in ĠData , ĠVC Ġ: ĠView Data Binding > Ġ: ĠView Type Factory Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠBind ĠData Ġobject Ġwith Ġview Ġon Ġthe Ġposition ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġcomponent Ġ( ViewData Binding ) Ġthat Ġrepresent Ġthis Ġview ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġticket ĠData Ġon Ġthe Ġposition ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġposition ĠView Ġposition Ġin Ġadapter ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġbind ( component : ĠVC , Ġdata : ĠData , Ġposition : ĠInt ); ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCreates ĠView Component Ġfor Ġthis ĠView Type ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġcreate View Component ( in flater : ĠLayoutInflater , Ġparent : ĠViewGroup ): ĠVC Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠData Binding Util . inflate < VC >( in flater , Ġview Type , Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }