package Ġio . github . tak us an 2 3 . tat im id roid . nic ov ideo . fragment Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . compose . material . Experimental Material Api Ċ import Ġandroidx . compose . ui . platform . Compose View Ċ import Ġandroidx . core . view . isVisible Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġandroidx . lifecycle . view model . compose . viewModel Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġio . github . tak us an 2 3 . tat im id roid . MainActivity Ċ import Ġio . github . tak us an 2 3 . tat im id roid . R Ċ import Ġio . github . tak us an 2 3 . tat im id roid . databinding . Fragment N ic ov ideo Post Binding Ċ import Ġio . github . tak us an 2 3 . tat im id roid . nico api . nic ov ideo . dataclass . N ico Video Data Ċ import Ġio . github . tak us an 2 3 . tat im id roid . nic ov ideo . adapter . N ico Video ListAdapter Ċ import Ġio . github . tak us an 2 3 . tat im id roid . nic ov ideo . compose . N ico Video Upload Screen Ċ import Ġio . github . tak us an 2 3 . tat im id roid . nic ov ideo . view model . N ico Video Upload Video ViewModel Ċ import Ġio . github . tak us an 2 3 . tat im id roid . nic ov ideo . view model . factory . N ico Video Upload Video ViewModel Factory Ċ Ċ /** Ċ Ġ* ĠæĬ ķ ç¨ ¿ åĭķ çĶ» è¡¨ç¤º Fragment Ċ Ġ* Ċ Ġ* ĠuserId Ġ| String Ġ| Ġãĥ ¦ãĥ¼ãĤ¶ãĥ¼ ID ãĤĴ åħ¥ ãĤĮãĤĭ ãģ¨ ãģĿãģ® ãĥ¦ãĥ¼ãĤ¶ãĥ¼ ãģ® æĬķ ç¨ ¿ ãģĹãģŁ åĭķ çĶ» ãĤĴåıĸå¾Ĺ ãģĹ ãģ« è¡Į ãģį ãģ¾ãģĻ ãĢĤ ãģªãģĦ åł´åĲĪãģ¯ èĩª åĪĨ ãģ® æĬķ ç¨ ¿ åĭķ çĶ» ãĤĴ åıĸ ãĤĬ ãģ« è¡Į ãģį ãģ¾ãģĻ Ċ Ġ* Ġ*/ Ċ class ĠN ico Video Upload Video Fragment Ġ: ĠFragment () Ġ{ ĊĊĠĠĠ Ġ/** Ġãĥĩãĥ¼ãĤ¿ åıĸå¾Ĺ ãģ¨ ãģĭ ãĥĩãĥ¼ãĤ¿ ä¿ĿæĮģ ãģ¨ ãģĭ Ġ*/ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġn ico Video Upload Video ViewModel : ĠN ico Video Upload Video ViewModel ĊĊĠĠĠ Ġ/** ĠRecyclerView ãģ¸ æ¸ ¡ ãģĻ éħį åĪĹ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġre cyclerView List Ġ= Ġarray ListOf < N ico Video Data >() ĊĊĠĠĠ Ġ/** ĠRecyclerView ãģ¸ ãĤ»ãĥĥãĥĪ ãģĻãĤĭ Adapter Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġn ico Video ListAdapter Ġ= ĠN ico Video ListAdapter ( re cyclerView List ) ĊĊĠĠĠ Ġ/** ĠfindViewById é § Ĩ éĢ Ĳ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġview Binding Ġby Ġlazy Ġ{ ĠFragment N ic ov ideo Post Binding . inflate ( layout Inflater ) Ġ} ĊĊĠĠĠ Ġ@ Experimental Material Api ĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( in flater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĠsavedInstanceState : ĠBundle ?): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCompose View ( require Context ()). apply Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠuserId Ġ= Ġarguments ?. getString (" userId ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Content Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN ico Video Upload Screen ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Ġ= ĠviewModel ( factory Ġ= ĠN ico Video Upload Video ViewModel Factory ( require Activity (). application , ĠuserId )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Video Click Ġ= Ġ{ Ġ( require Activity () Ġas ? ĠMainActivity )?. set N ic ov ideo Fragment ( it . video Id , Ġit . is Cache , Ġfalse , Ġtrue ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Menu Click Ġ= Ġ{ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval ĠuserId Ġ= Ġarguments ?. getString (" userId ") ĊĠĠĠĠĠĠĠ Ġn ico Video Upload Video ViewModel Ġ= ĠViewModel Provider ( this , ĠN ico Video Upload Video ViewModel Factory ( require Activity (). application , ĠuserId )). get ( N ico Video Upload Video ViewModel :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠRecyclerView åĪĿ æľŁ åĮĸ ĊĠĠĠĠĠĠĠ Ġinit RecyclerView () ĊĊĠĠĠĠĠĠĠ Ġ// Ġ èªŃãģ¿ è¾¼ ãģ¿ åıį æĺł LiveData ĊĠĠĠĠĠĠĠ Ġn ico Video Upload Video ViewModel . loading LiveData . observe ( view Lifecycle Owner ) Ġ{ ĠisLoading Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Binding . fragment N ic ov ideo Post Swipe To Refresh . is Refresh ing Ġ= ĠisLoading ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġãĥĩãĥ¼ãĤ¿ åıĹ ãģĳ åıĸ ãĤĭ ĊĠĠĠĠĠĠĠ Ġn ico Video Upload Video ViewModel . nico Video DataList LiveData . observe ( view Lifecycle Owner ) Ġ{ Ġvideo List Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠæĽ´æĸ° ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView List . addAll ( video List ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn ico Video ListAdapter . notify DataSet Changed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ ãĤ¹ãĤ¯ ãĥŃ ãĥ¼ãĥ« ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Binding . fragment N ic ov ideo Post RecyclerView . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( layout Manager Ġas ĠLinearLayoutManager ). scrollTo Position With Offset ( nico Video Upload Video ViewModel . re cyclerView Pos , Ġn ico Video Upload Video ViewModel . re cyclerView Y Pos ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ ãģĵãĤĮ ãģ§ æľĢ å¾Į ãģ§ãģĻ ãĢĤ ï¼Ľ ï¼Ľ ãģ¯ éħį åĪĹ ãģ® ä¸Ń èº« ãģĮ ä¸Ģ åĢĭ ä»¥ä¸Ĭ ãģĤ ãĤĮãģ° ãģª è© ± ãĢĤ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( nico Video Upload Video ViewModel . is End Ġ&& Ġre cyclerView List . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Toast ( getString ( R . string . end _ scroll )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ ãģĭãĤī ãģ£ ãģ ½ ãģª ãĤī æĬķ ç¨ ¿ åĭķ çĶ» éĿŀ åħ¬ éĸĭ ãĥ¡ ãĥĥãĤ»ãĥ¼ãĤ¸ è¡¨ç¤º ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Binding . fragment N ic ov ideo Post Private Message TextView . isVisible Ġ= Ġre cyclerView List . isEmpty () ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ãĤ¹ ãĥ¯ ãĤ¤ ãĥĹ æĽ´æĸ° ĊĠĠĠĠĠĠĠ Ġview Binding . fragment N ic ov ideo Post Swipe To Refresh . setOn Refresh Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn ico Video Upload Video ViewModel . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ ä½įç½® çĽ´ ãģĹ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView Pos Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView Y Pos Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Count Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġãĥĩãĥ¼ãĤ¿ ãĥª ãĤ»ãĥĥãĥĪ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn ico Video Upload Video ViewModel . nico Video DataList LiveData . value ?. clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView List . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn ico Video ListAdapter . notify DataSet Changed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ ãĥª ãĤ¯ ãĤ¨ ãĤ¹ãĥĪ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Video List ( page Count ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Toast ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġactivity ?. run On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( context , Ġmessage , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠRecyclerView åĪĿ æľŁ åĮĸ ĊĠĠĠ Ġprivate Ġfun Ġinit RecyclerView () Ġ{ ĊĠĠĠĠĠĠĠ Ġview Binding . fragment N ic ov ideo Post RecyclerView . apply Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Has Fixed Size ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlinear LayoutManager Ġ= ĠLinearLayoutManager ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager Ġ= Ġlinear LayoutManager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdapter ãĤ»ãĥĥãĥĪ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġn ico Video ListAdapter ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ è¿½åĬł èªŃãģ¿ è¾¼ ãģ¿ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd On Scroll Listener ( object Ġ: ĠRecyclerView . On Scroll Listener () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Sc rolled ( re cyclerView : ĠRecyclerView , Ġdx : ĠInt , Ġdy : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Sc rolled ( re cyclerView , Ġdx , Ġdy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvisible ItemCount Ġ= Ġre cyclerView . child Count ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtotal ItemCount Ġ= Ġlinear LayoutManager . item Count ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Visible Item Ġ= Ġlinear LayoutManager . findFirst Visible Item Position () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// æľĢ å¾Į ãģ¾ãģ§ ãĤ¹ãĤ¯ ãĥŃ ãĥ¼ãĥ« ãģĹãģŁ ãģ¨ ãģį ãģ® åĩ¦çĲĨ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( first Visible Item Ġ+ Ġvisible ItemCount Ġ== Ġtotal ItemCount Ġ&& Ġn ico Video Upload Video ViewModel . loading LiveData . value Ġ== Ġfalse Ġ&& Ġ! nico Video Upload Video ViewModel . is End ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ è¿½åĬł èªŃãģ¿ è¾¼ ãģ¿ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn ico Video Upload Video ViewModel . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ ä½įç½® çĽ´ ãģĹ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView Pos Ġ= Ġ( layout Manager Ġas ĠLinearLayoutManager ). findFirst Visible Item Position () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView Y Pos Ġ= Ġget Child At ( 0 ). top ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ ãĥª ãĤ¯ ãĤ¨ ãĤ¹ãĥĪ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Count ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Video List ( page Count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }