package Ġcom . kotlin . mv vm . syn er zip . utils . widget Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . ImageView Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . annotation . Drawable Res Ċ import Ġandroidx . annotation . String Res Ċ import Ġandroidx . recyclerview . widget . Grid LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . kotlin . mv vm . R Ċ import Ġcom . kotlin . mv vm . syn er zip . repository . api . network . Status Ċ import Ġcom . kotlin . mv vm . syn er zip . utils . extensions . g one Ċ import Ġcom . kotlin . mv vm . syn er zip . utils . extensions . visible Ċ Ċ /** Ċ Ġ* ĠA Ġcustom Ġimplementation Ġof Ġ[ RecyclerView ] Ġto Ġsupport Ċ Ġ* ĠEmpty ĠView Ġ& ĠLoading Ġanimation . Ċ Ġ*/ Ċ class ĠComplete RecyclerView Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠ Ġcontext : ĠContext , ĊĠĠĠ Ġattrs : ĠAttributeSet ? Ġ= Ġnull , ĊĠĠĠ Ġdef Style : ĠInt Ġ= Ġ 0 Ċ ) Ġ: ĠRecyclerView ( context , Ġattrs , Ġdef Style ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEmpty Ġlayout ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġm Empty View : ĠView ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠProgress Ġview ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġm Progress View : ĠView ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠColumn Ġwidth Ġfor Ġgrid Ġlayout ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġcolumn Width : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġgone () ĊĠĠĠĠĠĠĠ Ġif Ġ( attrs Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġattrs Array Ġ= Ġint ArrayOf ( android . R . attr . column Width ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarray Ġ= Ġcontext . obtain Styled Attributes ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattrs , Ġattrs Array ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolumn Width Ġ= Ġarray . get Dimension Pixel Size ( 0 , Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarray . recycle () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Adapter ( adapter : ĠRecyclerView . Adapter < *> ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġvisible () ĊĠĠĠĠĠĠĠ Ġval Ġold Adapter Ġ= Ġget Adapter () ĊĠĠĠĠĠĠĠ Ġold Adapter ?. unregister Adapter Data Observer ( m Adapter Observer ) ĊĠĠĠĠĠĠĠ Ġsuper . setAdapter ( adapter ) ĊĠĠĠĠĠĠĠ Ġadapter ?. register Adapter Data Observer ( m Adapter Observer ) ĊĠĠĠĠĠĠĠ Ġrefresh State () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrefresh State () Ġ{ ĊĠĠĠĠĠĠĠ Ġadapter ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġno Items Ġ= Ġ 0 Ġ== Ġit . item Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( no Items ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Progress View ?. g one () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Empty View ?. visible () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgone () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Progress View ?. g one () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Empty View ?. g one () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisible () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Empty View ( empty View : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . m Empty View Ġ= Ġempty View ĊĠĠĠĠĠĠĠ Ġm Empty View ?. g one () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Progress View ( progress View : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . m Progress View Ġ= Ġprogress View ĊĠĠĠĠĠĠĠ Ġm Progress View ?. g one () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshow Progress View () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Progress View ?. visible () ĊĠĠĠĠĠĠĠ Ġm Empty View ?. g one () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshow Empty State View () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Progress View ?. g one () ĊĠĠĠĠĠĠĠ Ġm Empty View ?. visible () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Empty Message (@ String Res Ġm Empty Message Res Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġempty Text Ġ= Ġm Empty View ?. findViewById < TextView >( R . id . empty _ title ) ĊĠĠĠĠĠĠĠ Ġempty Text ?. setText ( m Empty Message Res Id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Empty Icon (@ Drawable Res Ġm Empty Icon Res Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġempty Image Ġ= Ġm Empty View ?. findViewById < ImageView >( R . id . empty _ image ) ĊĠĠĠĠĠĠĠ Ġempty Image ?. setImage Resource ( m Empty Icon Res Id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshow State ( status : ĠStatus ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( status ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStatus . SUCCESS , ĠStatus . ERROR Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Progress View ?. g one () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Empty View ?. visible () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStatus . LOADING Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Empty View ?. g one () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Progress View ?. visible () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Measure ( width Spec : ĠInt , Ġheight Spec : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Measure ( width Spec , Ġheight Spec ) ĊĠĠĠĠĠĠĠ Ġif Ġ( layout Manager Ġis ĠGrid LayoutManager ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmanager Ġ= Ġlayout Manager Ġas ĠGrid LayoutManager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( column Width Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġspan Count Ġ= ĠMath . max ( 1 , Ġmeasured Width Ġ/ Ġcolumn Width ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmanager . span Count Ġ= Ġspan Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOb serves Ġfor Ġchanges Ġin Ġthe Ġadapter Ġand Ġis Ġtriggered Ġon Ġchange ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġm Adapter Observer Ġ= Ġobject Ġ: ĠRecyclerView . Adapter Data Observer () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonChanged () Ġ= Ġrefresh State () ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Item Range Inserted ( position Start : ĠInt , Ġitem Count : ĠInt ) Ġ= Ġrefresh State () ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Item Range Removed ( position Start : ĠInt , Ġitem Count : ĠInt ) Ġ= Ġrefresh State () ĊĠĠĠ Ġ} Ċ Ċ } Ċ