package Ġcom . dian ping . shield . node . cell node Ċ Ċ import Ġandroid . graphics . drawable . Drawable Ċ import Ġcom . dian ping . agent sdk . framework . Link Type Ċ import Ġcom . dian ping . shield . entity . Scroll Direction Ċ import Ġcom . dian ping . shield . expose . Entry Set Holder Ċ import Ġcom . dian ping . shield . expose . Range Ap pear StateManager Ċ import Ġcom . dian ping . shield . node . Position Type Ċ import Ġcom . dian ping . shield . node . cell node . callback . lazy load . Lazy Load Shield Row Provider Ċ import Ġcom . dian ping . shield . node . user item . Divider Style Ċ import Ġcom . dian ping . shield . utils . Range Remove able ArrayList Ċ import Ġkotlin . properties . Deleg ates Ċ Ċ /** Ċ Ġ* ĠCreated Ġby Ġz hi . he Ġon Ġ 2 0 1 8 / 6 / 2 5 . Ċ Ġ*/ Ċ open Ġclass ĠSh ield Section Ġ: ĠRange Holder , ĠEntry Set Holder < Shield Row > Ġ{ ĊĠĠĠ Ġprivate Ġval Ġobject List Observer s Ġ= ĠArrayList < Range Change Observer >() ĊĠĠĠ Ġoverride Ġfun Ġregister Observer ( observer : ĠRange Change Observer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġobject List Observer s . add ( observer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġunregister Observer ( observer : ĠRange Change Observer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġobject List Observer s . remove ( observer ) ĊĠĠĠ Ġ} Ċ Ċ // ĠĠĠ Ġ@ Jvm Field Ċ // ĠĠĠ Ġvar Ġsection Index : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġfun Ġcurrent Section Index (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcell Parent ?. shield Sections ?. indexOf ( this ) Ġ?: Ġ- 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġvar Ġcell Parent : ĠSh ield View Cell ? Ġ= Ġnull ĊĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġvar Ġhas Header Cell : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġvar Ġhas Footer Cell : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġvar Ġis Lazy Load Ġ= Ġfalse ĊĊĠĠĠ Ġvar Ġrow Provider : ĠLazy Load Shield Row Provider ? Ġ= Ġnull ĊĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġvar Ġshield Rows : ĠRange Remove able ArrayList < Shield Row ?> ? Ġ= Ġnull ĊĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġvar Ġsection Title : ĠString ? Ġ= Ġnull Ġ// Section Ġ æłĩé¢ĺ ĊĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġvar Ġprevious Link Type : ĠLink Type . Previous ? Ġ= Ġnull ĠĠ Ġ// section Link Type ĊĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġvar Ġnext Link Type : ĠLink Type . Next ? Ġ= Ġnull Ġ// ĊĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġvar Ġadjusted Previous Type : ĠLink Type . Previous ? Ġ= Ġnull ĊĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġvar Ġadjusted Next Type : ĠLink Type . Next ? Ġ= Ġnull ĊĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġvar Ġsection Header Height Ġ= Ġ 1 0 // Ġsection ĠG ap ĠçļĦ é«ĺåº¦ å®ļ åĪ¶ ï¼Į åľ¨ éĿŀ link çĬ¶æĢģ ä¸ĭ æľīæķĪ ï¼Į åįķä½į dp ĊĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġvar Ġsection Header Drawable : ĠDrawable ? Ġ= Ġnull // section ĠG ap çļĦ Drawable å®ļ åĪ¶ ĊĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġvar Ġsection Footer Height Ġ= Ġ 1 0 // Ġsection ĠG ap ĠçļĦ é«ĺåº¦ å®ļ åĪ¶ ï¼Į åľ¨ éĿŀ link çĬ¶æĢģ ä¸ĭ æľīæķĪ ï¼Į åįķä½į dp ĊĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġvar Ġsection Footer Drawable : ĠDrawable ? Ġ= Ġnull // section ĠG ap çļĦ Drawable å®ļ åĪ¶ ĊĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġvar Ġsection Divider Show Type : ĠDiv ider Style . Show Type Ġ= ĠDiv ider Style . Show Type . ALL ĊĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġvar Ġdivider Style : ĠDiv ider Style ? Ġ= Ġnull Ġ// åĪĴ çº¿ å®ļ åĪ¶ Ġå¦Ĥæŀľ è¡Į åĨħ æ²¡æľī å®ļ åĪ¶ åĪĴ çº¿ ï¼Į åĪĻ ä»¥ section ä¸ĬçļĦ åĪĴ çº¿ ä¸º åĩĨ ï¼Į å¦Ĥæŀľ section æ²¡æľī å®ļ åĪ¶ å°± èµ° é»ĺè®¤ ĊĊĠĠĠ Ġval Ġrange Dispatcher : ĠRange Dispatcher Ġby Ġlazy ( Lazy Thread Safety Mode . NONE ) Ġ{ ĊĠĠĠĠĠĠĠ ĠRange Dispatcher () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// åıª éľĢè¦ģ æĶ¹åıĺ section çļĦ Position Type ï¼Į ä¼ļ åĬ¨æĢģ è°ĥæķ´ Section çļĦ å¤´ èĬĤçĤ¹ æĪĸèĢħ å°¾ èĬĤçĤ¹ ĊĠĠĠ Ġvar Ġsection Position Type : ĠPosition Type Ġby ĠDeleg ates . observable ( Position Type . UNKNOWN ) Ġ{ Ġproperty , ĠoldValue , ĠnewValue Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( newValue Ġ!= ĠoldValue Ġ&& Ġget Range () Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( oldValue Ġ== ĠPosition Type . FIRST Ġ&& ĠnewValue Ġ== ĠPosition Type . MIDDLE ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( oldValue Ġ== ĠPosition Type . MIDDLE Ġ&& ĠnewValue Ġ== ĠPosition Type . FIRST ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( oldValue Ġ== ĠPosition Type . LAST Ġ&& ĠnewValue Ġ== ĠPosition Type . SINGLE ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( oldValue Ġ== ĠPosition Type . SINGLE Ġ&& ĠnewValue Ġ== ĠPosition Type . LAST ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Shield Display Node ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( oldValue Ġ== ĠPosition Type . FIRST Ġ&& ĠnewValue Ġ== ĠPosition Type . SINGLE ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( oldValue Ġ== ĠPosition Type . MIDDLE Ġ&& ĠnewValue Ġ== ĠPosition Type . LAST ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( oldValue Ġ== ĠPosition Type . LAST Ġ&& ĠnewValue Ġ== ĠPosition Type . MIDDLE ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( oldValue Ġ== ĠPosition Type . SINGLE Ġ&& ĠnewValue Ġ== ĠPosition Type . FIRST ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Shield Display Node ( get Range () Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Range (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrange Dispatcher . total Range ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Shield Display Node ( position : ĠInt ): ĠSh ield Display Node ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġnode : ĠSh ield Display Node ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ(( has Header Cell Ġ&& Ġposition Ġ== Ġ 0 ) Ġ|| Ġ( has Footer Cell Ġ&& Ġposition Ġ== Ġget Range () Ġ- Ġ 1 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode Ġ= Ġshield Rows ?. get ( position )?. getDisplay Node At Position ( 0 ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Pair Ġ= Ġrange Dispatcher . get Inner Position ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode Ġ= Ġget Shield Row ( position Pair ?. index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġ 0 )?. getDisplay Node At Position ( position Pair ?. inner Index Ġ?: Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġnode ?. let Ġ{ Ġcompute Node Position Type ( position , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnode ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġget Shield Row ( position : ĠInt ): ĠSh ield Row ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġshield Rows ?. get OrNull ( position ) Ġ?: Ġlet Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// row Provider ä¸į åĮħåĲ« Header åĴĮ Footer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprovider Position Ġ= Ġif Ġ( has Header Cell ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshield Row Ġ= Ġrow Provider ?. get Shield Row ( provider Position , Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshield Rows ?. set ( position , Ġshield Row ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshield Row ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠindexOf Shield Row ( shield Row : ĠSh ield Row ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġshield Rows ?. indexOf ( shield Row ) Ġ?: Ġ- 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠ Ġ* Ġposition Ġ è¿Ļä¸ª èĬĤçĤ¹ åľ¨ section ä¸ŃçļĦ å½ĵåīį ä½įç½® ĊĠĠĠ Ġ* Ġ**/ ĊĠĠĠ Ġprivate Ġfun Ġcompute Node Position Type ( position : ĠInt , Ġnode : ĠSh ield Display Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( section Position Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPosition Type . FIRST Ġ-> Ġwhen Ġ( position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġnode . position Type Ġ= ĠPosition Type . FIRST ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnode . position Type Ġ= ĠPosition Type . MIDDLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠPosition Type . MIDDLE Ġ-> Ġnode . position Type Ġ= ĠPosition Type . MIDDLE ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠPosition Type . LAST Ġ-> Ġwhen Ġ( position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Range () Ġ- Ġ 1 Ġ-> Ġnode . position Type Ġ= ĠPosition Type . LAST ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnode . position Type Ġ= ĠPosition Type . MIDDLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠPosition Type . SINGLE Ġ-> Ġwhen Ġ( position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġif Ġ( get Range () Ġ== Ġ 1 ) Ġnode . position Type Ġ= ĠPosition Type . SINGLE Ġelse Ġnode . position Type Ġ= ĠPosition Type . FIRST ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 1 Ġuntil Ġget Range () Ġ- Ġ 1 Ġ-> Ġnode . position Type Ġ= ĠPosition Type . MIDDLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Range () Ġ- Ġ 1 Ġ-> Ġif Ġ( get Range () Ġ== Ġ 1 ) Ġnode . position Type Ġ= ĠPosition Type . SINGLE Ġelse Ġnode . position Type Ġ= ĠPosition Type . LAST ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . position Type Ġ= ĠPosition Type . UNKNOWN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// è¿Ļä¸ª start Position ä¸į åĮħåĲ« Header Cell ĊĠĠĠ Ġfun Ġnotify Row Insert ( start Position : ĠInt , Ġcount : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ç´ ¯ åĬł æĸ°å¢ŀ Row çļĦ Range ä¹ĭ åĴĮ ĊĠĠĠĠĠĠĠ Ġvar Ġrange Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ// çĶŁæĪĲ æĸ°çļĦ Row Range Holder ĊĠĠĠĠĠĠĠ Ġval Ġrow Range Holder List Ġ= ĠArrayList < Row Range Holder >() ĊĠĠĠĠĠĠĠ Ġvar Ġsection Index Ġ= Ġcurrent Section Index () ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin ĠstartPosition Ġuntil ĠstartPosition Ġ+ Ġcount ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow Range Holder List . add ( Row Range Holder (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd Node Count Ġ= Ġrow Provider ?. getRow Node Count ( i , Ġthis @ Shield Section ) Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrange Count Ġ+= Ġd Node Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// æıĴåħ¥ åĪ° Section åĨħ çļĦ Holder Dispatcher ä¸Ń ä»¥ å¢ŀåĬł total Range ĊĠĠĠĠĠĠĠ Ġval Ġrow Start Position Ġ= Ġif Ġ( has Header Cell ) ĠstartPosition Ġ+ Ġ 1 Ġelse ĠstartPosition ĊĠĠĠĠĠĠĠ Ġrange Dispatcher . addAll ( row Start Position , Ġrow Range Holder List ) ĊĊĠĠĠĠĠĠĠ Ġ// ç¡®å®ļ æıĴåħ¥ åīį çļĦ Row çļĦ æľĢåĲİ ä¸Ģä¸ª èĬĤçĤ¹ çļĦ åħ¨å±Ģ ä½įç½® ï¼Į ç¡®å®ļ range ä¹ĭ åĴĮ ä½ľä¸º count ï¼Į ĊĠĠĠĠĠĠĠ Ġval Ġstart Range Position Ġ= Ġrange Dispatcher . getStart Position ( row Start Position ) ĊĊĠĠĠĠĠĠĠ Ġ// æī© å¤§ ç¼ĵ åĨ² åĮº ĊĠĠĠĠĠĠĠ Ġshield Rows ?. addAll ( row Start Position , ĠarrayOf Null s < Shield Row >( count ). asList ()) ĊĊĠĠĠĠĠĠĠ Ġreset Insert Neighbor Node ( row Start Position , Ġcount ) ĊĊĠĠĠĠĠĠĠ Ġmark Node Path Out Date ( row Start Position ) ĊĊĠĠĠĠĠĠĠ Ġobject List Observer s . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . on Item Range Inserted ( this , Ġstart Range Position , Ġrange Count ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// è¿Ļä¸ª start Position ä¸į åĮħåĲ« Header Cell ĊĠĠĠ Ġfun Ġnotify Row Remove ( start Position : ĠInt , Ġcount : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ç´ ¯ åĬł åĪłéĻ¤ çļĦ Row çļĦ Range ä¹ĭ åĴĮ ï¼Į ä»İ æĹ§ çļĦ range éĩĮéĿ¢ åĬł ĊĠĠĠĠĠĠĠ Ġvar Ġrange Count Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġ// èİ·åıĸ row Position ĊĠĠĠĠĠĠĠ Ġval Ġrow Start Position Ġ= Ġif Ġ( has Header Cell ) ĠstartPosition Ġ+ Ġ 1 Ġelse ĠstartPosition ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġrow Start Position Ġuntil Ġrow Start Position Ġ+ Ġcount ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrange Count Ġ+= Ġrange Dispatcher [ i ]. get Range () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ç¡®å®ļ æıĴåħ¥ åīį çļĦ Row çļĦ æľĢåĲİ ä¸Ģä¸ª èĬĤçĤ¹ çļĦ åħ¨å±Ģ ä½įç½® ï¼Į ç¡®å®ļ range ä¹ĭ åĴĮ ä½ľä¸º count ï¼Į ĊĠĠĠĠĠĠĠ Ġval Ġstart Range Position Ġ= Ġrange Dispatcher . getStart Position ( row Start Position ) ĊĊĠĠĠĠĠĠĠ Ġrange Dispatcher . remove Range ( row Start Position , Ġrow Start Position Ġ+ Ġcount ) ĊĊĠĠĠĠĠĠĠ Ġ// ç¼© å°ı ç¼ĵ åĨ² åĮº ĊĠĠĠĠĠĠĠ Ġshield Rows ?. remove Range ( row Start Position , Ġrow Start Position Ġ+ Ġcount ) ĊĊĠĠĠĠĠĠĠ Ġ// éĩįæĸ° è®¡ç®Ĺ çĽ¸ éĤ » èĬĤçĤ¹ Position Type ĊĠĠĠĠĠĠĠ Ġreset Remov et Neighbor Node ( row Start Position , Ġcount ) ĊĊĠĠĠĠĠĠĠ Ġmark Node Path Out Date ( row Start Position ) ĊĊĠĠĠĠĠĠĠ Ġ// mark Ġ åĲİ éĿ¢ æīĢæľīçļĦ row Ġpath è¯ķ ä¸ĭ ĊĊĠĠĠĠĠĠĠ Ġobject List Observer s . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . on Item Range Removed ( this , Ġstart Range Position , Ġrange Count ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// è¿Ļä¸ª start Position ä¸į åĮħåĲ« Header Cell ĊĠĠĠ Ġfun Ġnotify Row Update ( start Position : ĠInt , Ġcount : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// è¿ĻéĩĮ åħĪ ä¸į åĨį èĢĥèĻĳ Row ä¸ĭ å±Ĥ node çļĦ å±Ģ éĥ¨ åĪ·æĸ° ï¼Į ç»Łä¸Ģ è®¤ä¸º Row çļĦ Update ä¸įä¼ļ ĊĠĠĠĠĠĠĠ Ġ// Ġ å¯¼èĩ´ range åıĺåĮĸ ï¼Į ä»ħ ä»ħ åıªæĺ¯ è½¬ åĮĸ æĪĲ çĽ¸åºĶ çļĦ åħ¨å±Ģ change ĊĊĠĠĠĠĠĠĠ Ġvar Ġrange Count Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġ// èİ·åıĸ row Position ĊĠĠĠĠĠĠĠ Ġval Ġrow Start Position Ġ= Ġif Ġ( has Header Cell ) ĠstartPosition Ġ+ Ġ 1 Ġelse ĠstartPosition ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġrow Start Position Ġuntil Ġrow Start Position Ġ+ Ġcount ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrange Count Ġ+= Ġrange Dispatcher [ i ]. get Range () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// æ¸ħ ç©º å¯¹åºĶ ä½įç½® çļĦ ç¼ĵ åĨ² ï¼Į ä»¥ ä¾¿ éĩįæĸ° çĶŁæĪĲ èĬĤçĤ¹ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshield Rows ?. set ( i , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ç¡®å®ļ æıĴåħ¥ åīį çļĦ Row çļĦ æľĢåĲİ ä¸Ģä¸ª èĬĤçĤ¹ çļĦ åħ¨å±Ģ ä½įç½® ï¼Į ç¡®å®ļ range ä¹ĭ åĴĮ ä½ľä¸º count ï¼Į ĊĠĠĠĠĠĠĠ Ġval Ġstart Range Position Ġ= Ġrange Dispatcher . getStart Position ( row Start Position ) ĊĊĠĠĠĠĠĠĠ Ġobject List Observer s . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . on Item Range Changed ( this , Ġstart Range Position , Ġrange Count ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreset Insert Neighbor Node ( row Start Position : ĠInt , Ġcount : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// è°ĥæķ´ row Insert å¯¼èĩ´ çļĦ åīį ä¸Ģä¸ª åĴĮ åĲİ ä¸Ģä¸ª çļĦ èĬĤçĤ¹ ( å·²ç»ı çĶŁæĪĲ çļĦ Shield Display Node ) çļĦ Position Type ï¼Į è¿ĺ æ²¡æľī çĶŁæĪĲ çļĦ ä¸į ç®¡ ĊĠĠĠĠĠĠĠ Ġshield Rows ?. get OrNull ( row Start Position Ġ- Ġ 1 )?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshield Display Nodes ?. get OrNull ( shield Display Nodes ?. last Index Ġ?: Ġ- 1 )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . is Update Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġshield Rows ?. get OrNull ( row Start Position Ġ+ Ġcount )?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshield Display Nodes ?. get OrNull ( 0 )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . is Update Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreset Remov et Neighbor Node ( row Start Position : ĠInt , Ġcount : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// è°ĥæķ´ row Insert å¯¼èĩ´ çļĦ åīį ä¸Ģä¸ª åĴĮ åĲİ ä¸Ģä¸ª çļĦ èĬĤçĤ¹ ( å·²ç»ı çĶŁæĪĲ çļĦ Shield Display Node ) çļĦ Position Type ï¼Į è¿ĺ æ²¡æľī çĶŁæĪĲ çļĦ ä¸į ç®¡ ĊĠĠĠĠĠĠĠ Ġshield Rows ?. get OrNull ( row Start Position Ġ- Ġ 1 )?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshield Display Nodes ?. get OrNull ( shield Display Nodes ?. last Index Ġ?: Ġ- 1 )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . is Update Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġshield Rows ?. get OrNull ( row Start Position )?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshield Display Nodes ?. get OrNull ( 0 )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . is Update Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmark Node Path Out Date ( row Start Position : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġrow Start Position .. ( shield Rows ?. last Index Ġ?: Ġ- 1 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshield Rows ?. get ( i )?. shield Display Nodes ?. forEach Ġ{ Ġnode Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode ?. path Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġvar Ġattach Status ChangeListener List : ĠArrayList < Attach Status ChangeListener < Shield Section >> ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġfun Ġdispatch Attach Status Changed ( old Attach Status : ĠAttach Status ?, Ġnew Attach Status : ĠAttach Status ?, Ġdirection : ĠScroll Direction ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġattach Status ChangeListener List ?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . on Attach Status Changed ( this @ Shield Section . cell Parent ?. indexOf Shield Section ( this @ Shield Section ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġ- 1 , Ġthis @ Shield Section , Ġold Attach Status , Ġnew Attach Status , Ġdirection ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġvar Ġmove Status EventListener List : ĠArrayList < Move Status EventListener < Shield Section >> ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġfun Ġdispatch Appearance Event ( appearance Event : ĠAp pearance Event ?, Ġdirection : ĠScroll Direction ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġmove Status EventListener List ?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( appearance Event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAp pearance Event . FULL Y _ AP PE AR , ĠAp pearance Event . PART LY _ AP PE AR Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . on Ap pe ared ( this @ Shield Section . cell Parent ?. indexOf Shield Section ( this @ Shield Section ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Shield Section , Ġappearance Event , Ġdirection ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAp pearance Event . FULL Y _ DIS AP PE AR , ĠAp pearance Event . PART LY _ DIS AP PE AR Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . on Dis appe ared ( this @ Shield Section . cell Parent ?. indexOf Shield Section ( this @ Shield Section ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Shield Section , Ġappearance Event , Ġdirection ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġvar Ġrange Ap pear StateManager : ĠRange Ap pear StateManager < Shield Row > Ġ= ĠRange Ap pear StateManager ( this ) ĊĊĠĠĠ Ġoverride Ġfun Ġget Entry Count (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġshield Rows ?. size Ġ?: Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Entry ( position : ĠInt ): ĠSh ield Row ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Shield Row ( position ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Attach StateChanged ( old Attach Status : ĠAttach Status ?, Ġnew Attach Status : ĠAttach Status ?, Ġdirection : ĠScroll Direction ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġdispatch Attach Status Changed ( old Attach Status , Ġnew Attach Status , Ġdirection ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Appearance Event ( appearance Event : ĠAp pearance Event ?, Ġdirection : ĠScroll Direction ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġdispatch Appearance Event ( appearance Event , Ġdirection ) ĊĠĠĠ Ġ} Ċ }