meta.html 153 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066
  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <title data-rh="true">Using DiffUtil.ItemCallback for Efficient RecyclerView Updates | by Sandeep Kella | Medium
  5. </title>
  6. <meta data-rh="true" charset="utf-8" />
  7. <meta data-rh="true" name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1,maximum-scale=1" />
  8. <meta data-rh="true" name="theme-color" content="#000000" />
  9. <meta data-rh="true" name="twitter:app:name:iphone" content="Medium" />
  10. <meta data-rh="true" name="twitter:app:id:iphone" content="828256236" />
  11. <meta data-rh="true" property="al:ios:app_name" content="Medium" />
  12. <meta data-rh="true" property="al:ios:app_store_id" content="828256236" />
  13. <meta data-rh="true" property="al:android:package" content="com.medium.reader" />
  14. <meta data-rh="true" property="fb:app_id" content="542599432471018" />
  15. <meta data-rh="true" property="og:site_name" content="Medium" />
  16. <meta data-rh="true" property="og:type" content="article" />
  17. <meta data-rh="true" property="article:published_time" content="2024-05-15T23:51:34.732Z" />
  18. <meta data-rh="true" name="title"
  19. content="Using DiffUtil.ItemCallback for Efficient RecyclerView Updates | by Sandeep Kella | Medium" />
  20. <meta data-rh="true" property="og:title" content="Using DiffUtil.ItemCallback for Efficient RecyclerView Updates" />
  21. <meta data-rh="true" property="al:android:url" content="medium://p/729615b3528c" />
  22. <meta data-rh="true" property="al:ios:url" content="medium://p/729615b3528c" />
  23. <meta data-rh="true" property="al:android:app_name" content="Medium" />
  24. <meta data-rh="true" name="description"
  25. content="Use Case: Imagine you have a RecyclerView displaying a list of tasks. When a user marks a task as complete, you want to update the UI to reflect the change (e.g., strikethrough for completed tasks)…" />
  26. <meta data-rh="true" property="og:description"
  27. content="Here’s an explanation of DiffUtil.ItemCallback with a sample use case and code:" />
  28. <meta data-rh="true" property="og:url"
  29. content="https://medium.com/@sandeepkella23/using-diffutil-itemcallback-for-efficient-recyclerview-updates-729615b3528c" />
  30. <meta data-rh="true" property="al:web:url"
  31. content="https://medium.com/@sandeepkella23/using-diffutil-itemcallback-for-efficient-recyclerview-updates-729615b3528c" />
  32. <meta data-rh="true" property="og:image"
  33. content="https://miro.medium.com/v2/resize:fit:1078/1*9-tDBevuDRdN2pMUN5GJhg.png" />
  34. <meta data-rh="true" property="article:author" content="https://medium.com/@sandeepkella23" />
  35. <meta data-rh="true" name="author" content="Sandeep Kella" />
  36. <meta data-rh="true" name="robots" content="index,noarchive,follow,max-image-preview:large" />
  37. <meta data-rh="true" name="referrer" content="unsafe-url" />
  38. <meta data-rh="true" property="twitter:title"
  39. content="Using DiffUtil.ItemCallback for Efficient RecyclerView Updates" />
  40. <meta data-rh="true" name="twitter:site" content="@Medium" />
  41. <meta data-rh="true" name="twitter:app:url:iphone" content="medium://p/729615b3528c" />
  42. <meta data-rh="true" property="twitter:description"
  43. content="Here’s an explanation of DiffUtil.ItemCallback with a sample use case and code:" />
  44. <meta data-rh="true" name="twitter:image:src"
  45. content="https://miro.medium.com/v2/resize:fit:1078/1*9-tDBevuDRdN2pMUN5GJhg.png" />
  46. <meta data-rh="true" name="twitter:card" content="summary_large_image" />
  47. <meta data-rh="true" name="twitter:label1" content="Reading time" />
  48. <meta data-rh="true" name="twitter:data1" content="2 min read" />
  49. <link data-rh="true" rel="icon"
  50. href="https://miro.medium.com/v2/5d8de952517e8160e40ef9841c781cdc14a5db313057fa3c3de41c6f5b494b19" />
  51. <link data-rh="true" rel="search" type="application/opensearchdescription+xml" title="Medium" href="/osd.xml" />
  52. <link data-rh="true" rel="apple-touch-icon" sizes="152x152"
  53. href="https://miro.medium.com/v2/resize:fill:304:304/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156" />
  54. <link data-rh="true" rel="apple-touch-icon" sizes="120x120"
  55. href="https://miro.medium.com/v2/resize:fill:240:240/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156" />
  56. <link data-rh="true" rel="apple-touch-icon" sizes="76x76"
  57. href="https://miro.medium.com/v2/resize:fill:152:152/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156" />
  58. <link data-rh="true" rel="apple-touch-icon" sizes="60x60"
  59. href="https://miro.medium.com/v2/resize:fill:120:120/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156" />
  60. <link data-rh="true" rel="mask-icon"
  61. href="https://miro.medium.com/v2/resize:fill:1000:1000/7*GAOKVe--MXbEJmV9230oOQ.png" color="#171717" />
  62. <link data-rh="true" id="glyph_preload_link" rel="preload" as="style" type="text/css"
  63. href="https://glyph.medium.com/css/unbound.css" />
  64. <link data-rh="true" id="glyph_link" rel="stylesheet" type="text/css"
  65. href="https://glyph.medium.com/css/unbound.css" />
  66. <link data-rh="true" rel="author" href="https://medium.com/@sandeepkella23" />
  67. <link data-rh="true" rel="canonical"
  68. href="https://medium.com/@sandeepkella23/using-diffutil-itemcallback-for-efficient-recyclerview-updates-729615b3528c" />
  69. <link data-rh="true" rel="alternate" href="android-app://com.medium.reader/https/medium.com/p/729615b3528c" />
  70. <script data-rh="true"
  71. type="application/ld+json">{"@context":"http:\u002F\u002Fschema.org","@type":"NewsArticle","image":["https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1200\u002F1*9-tDBevuDRdN2pMUN5GJhg.png"],"url":"https:\u002F\u002Fmedium.com\u002F@sandeepkella23\u002Fusing-diffutil-itemcallback-for-efficient-recyclerview-updates-729615b3528c","dateCreated":"2024-05-15T23:51:34.732Z","datePublished":"2024-05-15T23:51:34.732Z","dateModified":"2024-11-26T11:08:41.326Z","headline":"Using DiffUtil.ItemCallback for Efficient RecyclerView Updates","name":"Using DiffUtil.ItemCallback for Efficient RecyclerView Updates","description":"Use Case: Imagine you have a RecyclerView displaying a list of tasks. When a user marks a task as complete, you want to update the UI to reflect the change (e.g., strikethrough for completed tasks)…","identifier":"729615b3528c","author":{"@type":"Person","name":"Sandeep Kella","url":"https:\u002F\u002Fmedium.com\u002F@sandeepkella23"},"creator":["Sandeep Kella"],"publisher":{"@type":"Organization","name":"Medium","url":"https:\u002F\u002Fmedium.com\u002F","logo":{"@type":"ImageObject","width":272,"height":60,"url":"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:544\u002F7*V1_7XP4snlmqrc_0Njontw.png"}},"mainEntityOfPage":"https:\u002F\u002Fmedium.com\u002F@sandeepkella23\u002Fusing-diffutil-itemcallback-for-efficient-recyclerview-updates-729615b3528c"}</script>
  72. <style type="text/css" data-fela-rehydration="498" data-fela-type="STATIC">
  73. html {
  74. box-sizing: border-box;
  75. -webkit-text-size-adjust: 100%
  76. }
  77. *,
  78. *:before,
  79. *:after {
  80. box-sizing: inherit
  81. }
  82. body {
  83. margin: 0;
  84. padding: 0;
  85. text-rendering: optimizeLegibility;
  86. -webkit-font-smoothing: antialiased;
  87. color: rgba(0, 0, 0, 0.8);
  88. position: relative;
  89. min-height: 100vh
  90. }
  91. h1,
  92. h2,
  93. h3,
  94. h4,
  95. h5,
  96. h6,
  97. dl,
  98. dd,
  99. ol,
  100. ul,
  101. menu,
  102. figure,
  103. blockquote,
  104. p,
  105. pre,
  106. form {
  107. margin: 0
  108. }
  109. menu,
  110. ol,
  111. ul {
  112. padding: 0;
  113. list-style: none;
  114. list-style-image: none
  115. }
  116. main {
  117. display: block
  118. }
  119. a {
  120. color: inherit;
  121. text-decoration: none
  122. }
  123. a,
  124. button,
  125. input {
  126. -webkit-tap-highlight-color: transparent
  127. }
  128. img,
  129. svg {
  130. vertical-align: middle
  131. }
  132. button {
  133. background: transparent;
  134. overflow: visible
  135. }
  136. button,
  137. input,
  138. optgroup,
  139. select,
  140. textarea {
  141. margin: 0
  142. }
  143. :root {
  144. --reach-tabs: 1;
  145. --reach-menu-button: 1
  146. }
  147. #speechify-root {
  148. font-family: Sohne, sans-serif
  149. }
  150. div[data-popper-reference-hidden="true"] {
  151. visibility: hidden;
  152. pointer-events: none
  153. }
  154. .grecaptcha-badge {
  155. visibility: hidden
  156. }
  157. /*XCode style (c) Angel Garcia <angelgarcia.mail@gmail.com>*/
  158. .hljs {
  159. background: #fff;
  160. color: black;
  161. }
  162. /* Gray DOCTYPE selectors like WebKit */
  163. .xml .hljs-meta {
  164. color: #c0c0c0;
  165. }
  166. .hljs-comment,
  167. .hljs-quote {
  168. color: #007400;
  169. }
  170. .hljs-tag,
  171. .hljs-attribute,
  172. .hljs-keyword,
  173. .hljs-selector-tag,
  174. .hljs-literal,
  175. .hljs-name {
  176. color: #aa0d91;
  177. }
  178. .hljs-variable,
  179. .hljs-template-variable {
  180. color: #3F6E74;
  181. }
  182. .hljs-code,
  183. .hljs-string,
  184. .hljs-meta .hljs-string {
  185. color: #c41a16;
  186. }
  187. .hljs-regexp,
  188. .hljs-link {
  189. color: #0E0EFF;
  190. }
  191. .hljs-title,
  192. .hljs-symbol,
  193. .hljs-bullet,
  194. .hljs-number {
  195. color: #1c00cf;
  196. }
  197. .hljs-section,
  198. .hljs-meta {
  199. color: #643820;
  200. }
  201. .hljs-title.class_,
  202. .hljs-class .hljs-title,
  203. .hljs-type,
  204. .hljs-built_in,
  205. .hljs-params {
  206. color: #5c2699;
  207. }
  208. .hljs-attr {
  209. color: #836C28;
  210. }
  211. .hljs-subst {
  212. color: #000;
  213. }
  214. .hljs-formula {
  215. background-color: #eee;
  216. font-style: italic;
  217. }
  218. .hljs-addition {
  219. background-color: #baeeba;
  220. }
  221. .hljs-deletion {
  222. background-color: #ffc8bd;
  223. }
  224. .hljs-selector-id,
  225. .hljs-selector-class {
  226. color: #9b703f;
  227. }
  228. .hljs-doctag,
  229. .hljs-strong {
  230. font-weight: bold;
  231. }
  232. .hljs-emphasis {
  233. font-style: italic;
  234. }
  235. </style>
  236. <style type="text/css" data-fela-rehydration="498" data-fela-type="KEYFRAME">
  237. @-webkit-keyframes k1 {
  238. 0% {
  239. opacity: 0.8
  240. }
  241. 50% {
  242. opacity: 0.5
  243. }
  244. 100% {
  245. opacity: 0.8
  246. }
  247. }
  248. @-moz-keyframes k1 {
  249. 0% {
  250. opacity: 0.8
  251. }
  252. 50% {
  253. opacity: 0.5
  254. }
  255. 100% {
  256. opacity: 0.8
  257. }
  258. }
  259. @keyframes k1 {
  260. 0% {
  261. opacity: 0.8
  262. }
  263. 50% {
  264. opacity: 0.5
  265. }
  266. 100% {
  267. opacity: 0.8
  268. }
  269. }
  270. @-webkit-keyframes k2 {
  271. 0% {
  272. transform: scale(1)
  273. }
  274. 50% {
  275. transform: scale(1.1)
  276. }
  277. 100% {
  278. transform: scale(1)
  279. }
  280. }
  281. @-moz-keyframes k2 {
  282. 0% {
  283. transform: scale(1)
  284. }
  285. 50% {
  286. transform: scale(1.1)
  287. }
  288. 100% {
  289. transform: scale(1)
  290. }
  291. }
  292. @keyframes k2 {
  293. 0% {
  294. transform: scale(1)
  295. }
  296. 50% {
  297. transform: scale(1.1)
  298. }
  299. 100% {
  300. transform: scale(1)
  301. }
  302. }
  303. </style>
  304. <style type="text/css" data-fela-rehydration="498" data-fela-type="RULE">
  305. .a {
  306. font-family: medium-content-sans-serif-font, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif
  307. }
  308. .b {
  309. font-weight: 400
  310. }
  311. .c {
  312. background-color: rgba(255, 255, 255, 1)
  313. }
  314. .l {
  315. display: block
  316. }
  317. .m {
  318. position: sticky
  319. }
  320. .n {
  321. top: 0
  322. }
  323. .o {
  324. z-index: 500
  325. }
  326. .p {
  327. padding: 0 24px
  328. }
  329. .q {
  330. align-items: center
  331. }
  332. .r {
  333. border-bottom: solid 1px #F2F2F2
  334. }
  335. .y {
  336. height: 41px
  337. }
  338. .z {
  339. line-height: 20px
  340. }
  341. .ab {
  342. display: flex
  343. }
  344. .ac {
  345. height: 57px
  346. }
  347. .ae {
  348. flex: 1 0 auto
  349. }
  350. .af {
  351. color: inherit
  352. }
  353. .ag {
  354. fill: inherit
  355. }
  356. .ah {
  357. font-size: inherit
  358. }
  359. .ai {
  360. border: inherit
  361. }
  362. .aj {
  363. font-family: inherit
  364. }
  365. .ak {
  366. letter-spacing: inherit
  367. }
  368. .al {
  369. font-weight: inherit
  370. }
  371. .am {
  372. padding: 0
  373. }
  374. .an {
  375. margin: 0
  376. }
  377. .ao {
  378. cursor: pointer
  379. }
  380. .ap:disabled {
  381. cursor: not-allowed
  382. }
  383. .aq:disabled {
  384. color: #6B6B6B
  385. }
  386. .ar:disabled {
  387. fill: #6B6B6B
  388. }
  389. .au {
  390. width: auto
  391. }
  392. .av path {
  393. fill: #242424
  394. }
  395. .aw {
  396. height: 25px
  397. }
  398. .ax {
  399. margin-left: 16px
  400. }
  401. .ay {
  402. border: none
  403. }
  404. .az {
  405. border-radius: 20px
  406. }
  407. .ba {
  408. width: 240px
  409. }
  410. .bb {
  411. background: #F9F9F9
  412. }
  413. .bc path {
  414. fill: #6B6B6B
  415. }
  416. .be {
  417. outline: none
  418. }
  419. .bf {
  420. font-family: sohne, "Helvetica Neue", Helvetica, Arial, sans-serif
  421. }
  422. .bg {
  423. font-size: 14px
  424. }
  425. .bh {
  426. width: 100%
  427. }
  428. .bi {
  429. padding: 10px 20px 10px 0
  430. }
  431. .bj {
  432. background-color: transparent
  433. }
  434. .bk {
  435. color: #242424
  436. }
  437. .bl::placeholder {
  438. color: #6B6B6B
  439. }
  440. .bm {
  441. display: inline-block
  442. }
  443. .bn {
  444. margin-left: 12px
  445. }
  446. .bo {
  447. margin-right: 12px
  448. }
  449. .bp {
  450. border-radius: 4px
  451. }
  452. .bq {
  453. margin-left: 24px
  454. }
  455. .br {
  456. height: 24px
  457. }
  458. .bx {
  459. background-color: #F9F9F9
  460. }
  461. .by {
  462. border-radius: 50%
  463. }
  464. .bz {
  465. height: 32px
  466. }
  467. .ca {
  468. width: 32px
  469. }
  470. .cb {
  471. justify-content: center
  472. }
  473. .ch {
  474. max-width: 680px
  475. }
  476. .ci {
  477. min-width: 0
  478. }
  479. .cj {
  480. animation: k1 1.2s ease-in-out infinite
  481. }
  482. .ck {
  483. height: 100vh
  484. }
  485. .cl {
  486. margin-bottom: 16px
  487. }
  488. .cm {
  489. margin-top: 48px
  490. }
  491. .cn {
  492. align-items: flex-start
  493. }
  494. .co {
  495. flex-direction: column
  496. }
  497. .cp {
  498. justify-content: space-between
  499. }
  500. .cq {
  501. margin-bottom: 24px
  502. }
  503. .cw {
  504. width: 80%
  505. }
  506. .cx {
  507. background-color: #F2F2F2
  508. }
  509. .dd {
  510. height: 44px
  511. }
  512. .de {
  513. width: 44px
  514. }
  515. .df {
  516. margin: auto 0
  517. }
  518. .dg {
  519. margin-bottom: 4px
  520. }
  521. .dh {
  522. height: 16px
  523. }
  524. .di {
  525. width: 120px
  526. }
  527. .dj {
  528. width: 80px
  529. }
  530. .dp {
  531. margin-bottom: 8px
  532. }
  533. .dq {
  534. width: 96%
  535. }
  536. .dr {
  537. width: 98%
  538. }
  539. .ds {
  540. width: 81%
  541. }
  542. .dw {
  543. margin-left: 8px
  544. }
  545. .dx {
  546. color: #6B6B6B
  547. }
  548. .dy {
  549. font-size: 13px
  550. }
  551. .dz {
  552. height: 100%
  553. }
  554. .ec {
  555. margin-right: 32px
  556. }
  557. .ed {
  558. position: relative
  559. }
  560. .ee {
  561. fill: #6B6B6B
  562. }
  563. .eh {
  564. background: transparent
  565. }
  566. .ei svg {
  567. margin-left: 4px
  568. }
  569. .ej svg {
  570. fill: #6B6B6B
  571. }
  572. .el {
  573. box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.05)
  574. }
  575. .em {
  576. position: absolute
  577. }
  578. .ep {
  579. box-sizing: border-box
  580. }
  581. .ev {
  582. margin: 0 24px
  583. }
  584. .ez {
  585. background: rgba(255, 255, 255, 1)
  586. }
  587. .fa {
  588. border: 1px solid #F2F2F2
  589. }
  590. .fb {
  591. box-shadow: 0 1px 4px #F2F2F2
  592. }
  593. .fc {
  594. max-height: 100vh
  595. }
  596. .fd {
  597. overflow-y: auto
  598. }
  599. .fe {
  600. left: 0
  601. }
  602. .ff {
  603. top: calc(100vh + 100px)
  604. }
  605. .fg {
  606. bottom: calc(100vh + 100px)
  607. }
  608. .fh {
  609. width: 10px
  610. }
  611. .fi {
  612. pointer-events: none
  613. }
  614. .fj {
  615. word-break: break-word
  616. }
  617. .fk {
  618. word-wrap: break-word
  619. }
  620. .fl:after {
  621. display: block
  622. }
  623. .fm:after {
  624. content: ""
  625. }
  626. .fn:after {
  627. clear: both
  628. }
  629. .fo {
  630. margin-left: auto
  631. }
  632. .fp {
  633. margin-right: auto
  634. }
  635. .fq {
  636. max-width: 1078px
  637. }
  638. .fw {
  639. clear: both
  640. }
  641. .fy {
  642. cursor: zoom-in
  643. }
  644. .fz {
  645. z-index: auto
  646. }
  647. .gb {
  648. max-width: 100%
  649. }
  650. .gc {
  651. height: auto
  652. }
  653. .gd {
  654. line-height: 1.23
  655. }
  656. .ge {
  657. letter-spacing: 0
  658. }
  659. .gf {
  660. font-style: normal
  661. }
  662. .gg {
  663. font-weight: 700
  664. }
  665. .hl {
  666. align-items: baseline
  667. }
  668. .hm {
  669. width: 48px
  670. }
  671. .hn {
  672. height: 48px
  673. }
  674. .ho {
  675. border: 2px solid rgba(255, 255, 255, 1)
  676. }
  677. .hp {
  678. z-index: 0
  679. }
  680. .hq {
  681. box-shadow: none
  682. }
  683. .hr {
  684. border: 1px solid rgba(0, 0, 0, 0.05)
  685. }
  686. .hs {
  687. margin-bottom: 2px
  688. }
  689. .ht {
  690. flex-wrap: nowrap
  691. }
  692. .hu {
  693. font-size: 16px
  694. }
  695. .hv {
  696. line-height: 24px
  697. }
  698. .hx {
  699. margin: 0 8px
  700. }
  701. .hy {
  702. display: inline
  703. }
  704. .hz {
  705. color: #1A8917
  706. }
  707. .ia {
  708. fill: #1A8917
  709. }
  710. .ib:disabled {
  711. opacity: 0.3
  712. }
  713. .ie {
  714. flex: 0 0 auto
  715. }
  716. .ih {
  717. flex-wrap: wrap
  718. }
  719. .ii {
  720. padding-left: 8px
  721. }
  722. .ij {
  723. padding-right: 8px
  724. }
  725. .jk>* {
  726. flex-shrink: 0
  727. }
  728. .jl {
  729. overflow-x: scroll
  730. }
  731. .jm::-webkit-scrollbar {
  732. display: none
  733. }
  734. .jn {
  735. scrollbar-width: none
  736. }
  737. .jo {
  738. -ms-overflow-style: none
  739. }
  740. .jp {
  741. width: 74px
  742. }
  743. .jq {
  744. flex-direction: row
  745. }
  746. .jr {
  747. z-index: 2
  748. }
  749. .js {
  750. margin-right: 4px
  751. }
  752. .jv {
  753. -webkit-user-select: none
  754. }
  755. .jw {
  756. border: 0
  757. }
  758. .jx {
  759. cursor: progress
  760. }
  761. .jy {
  762. fill: rgba(117, 117, 117, 1)
  763. }
  764. .kb {
  765. opacity: 0.25
  766. }
  767. .kc {
  768. outline: 0
  769. }
  770. .kd {
  771. user-select: none
  772. }
  773. .ke>svg {
  774. pointer-events: none
  775. }
  776. .kn {
  777. opacity: 1
  778. }
  779. .ko {
  780. padding: 4px 0
  781. }
  782. .kr {
  783. margin-top: 0px
  784. }
  785. .ks {
  786. width: 16px
  787. }
  788. .kt {
  789. padding: 8px 2px
  790. }
  791. .kw svg path {
  792. fill: #6B6B6B
  793. }
  794. .kx {
  795. display: inline-flex
  796. }
  797. .ld svg {
  798. color: #6B6B6B
  799. }
  800. .lu {
  801. line-height: 1.58
  802. }
  803. .lv {
  804. letter-spacing: -0.004em
  805. }
  806. .lw {
  807. font-family: source-serif-pro, Georgia, Cambria, "Times New Roman", Times, serif
  808. }
  809. .mr {
  810. margin-bottom: -0.46em
  811. }
  812. .mx {
  813. overflow-x: auto
  814. }
  815. .my {
  816. font-family: source-code-pro, Menlo, Monaco, "Courier New", Courier, monospace
  817. }
  818. .mz {
  819. padding: 32px
  820. }
  821. .na {
  822. border: 1px solid #E5E5E5
  823. }
  824. .nb {
  825. line-height: 1.4
  826. }
  827. .nc {
  828. letter-spacing: -0.022em
  829. }
  830. .nd {
  831. margin-top: -0.2em
  832. }
  833. .ne {
  834. margin-bottom: -0.2em
  835. }
  836. .nf {
  837. white-space: pre
  838. }
  839. .ng {
  840. min-width: fit-content
  841. }
  842. .nh {
  843. list-style-type: disc
  844. }
  845. .ni {
  846. margin-left: 30px
  847. }
  848. .nj {
  849. padding-left: 0px
  850. }
  851. .nk {
  852. padding: 2px 4px
  853. }
  854. .nl {
  855. font-size: 75%
  856. }
  857. .nm>strong {
  858. font-family: inherit
  859. }
  860. .ns {
  861. margin-bottom: 26px
  862. }
  863. .nt {
  864. margin-top: 6px
  865. }
  866. .nu {
  867. margin-top: 8px
  868. }
  869. .nv {
  870. margin-right: 8px
  871. }
  872. .nw {
  873. padding: 8px 16px
  874. }
  875. .nx {
  876. border-radius: 100px
  877. }
  878. .ny {
  879. transition: background 300ms ease
  880. }
  881. .oa {
  882. white-space: nowrap
  883. }
  884. .ob {
  885. border-top: none
  886. }
  887. .oc {
  888. margin-bottom: 50px
  889. }
  890. .od {
  891. height: 52px
  892. }
  893. .oe {
  894. max-height: 52px
  895. }
  896. .of {
  897. box-sizing: content-box
  898. }
  899. .og {
  900. position: static
  901. }
  902. .oh {
  903. z-index: 1
  904. }
  905. .oj {
  906. max-width: 155px
  907. }
  908. .op {
  909. margin-right: 20px
  910. }
  911. .oq {
  912. margin-bottom: 64px
  913. }
  914. .pf {
  915. height: 64px
  916. }
  917. .pg {
  918. width: 64px
  919. }
  920. .ph {
  921. align-self: flex-end
  922. }
  923. .pi {
  924. color: #F2F2F2
  925. }
  926. .pj {
  927. fill: #F2F2F2
  928. }
  929. .pk {
  930. background: #F2F2F2
  931. }
  932. .pl {
  933. border-color: #F2F2F2
  934. }
  935. .pr:disabled {
  936. cursor: inherit !important
  937. }
  938. .ps:disabled {
  939. opacity: 0.1
  940. }
  941. .pt:disabled:hover {
  942. background: rgba(25, 25, 25, 1)
  943. }
  944. .pu:disabled:hover {
  945. border-color: rgba(25, 25, 25, 1)
  946. }
  947. .pv {
  948. border-radius: 99em
  949. }
  950. .pw {
  951. border-width: 1px
  952. }
  953. .px {
  954. border-style: solid
  955. }
  956. .py {
  957. text-decoration: none
  958. }
  959. .pz {
  960. text-align: center
  961. }
  962. .qa {
  963. flex: 1 1 auto
  964. }
  965. .qg {
  966. padding-right: 4px
  967. }
  968. .qh {
  969. font-weight: 500
  970. }
  971. .qu {
  972. white-space: pre-wrap
  973. }
  974. .qv {
  975. margin-top: 16px
  976. }
  977. .qw {
  978. margin-bottom: 54px
  979. }
  980. .qx {
  981. height: 0px
  982. }
  983. .rn {
  984. gap: 18px
  985. }
  986. .ro {
  987. fill: rgba(61, 61, 61, 1)
  988. }
  989. .sa {
  990. border-bottom: solid 1px #E5E5E5
  991. }
  992. .sb {
  993. margin-top: 72px
  994. }
  995. .sc {
  996. padding: 24px 0
  997. }
  998. .sd {
  999. margin-bottom: 0px
  1000. }
  1001. .se {
  1002. margin-right: 16px
  1003. }
  1004. .as:hover:not(:disabled) {
  1005. color: rgba(25, 25, 25, 1)
  1006. }
  1007. .at:hover:not(:disabled) {
  1008. fill: rgba(25, 25, 25, 1)
  1009. }
  1010. .ef:hover {
  1011. color: #242424
  1012. }
  1013. .eg:hover {
  1014. fill: #242424
  1015. }
  1016. .ek:hover svg {
  1017. fill: #242424
  1018. }
  1019. .eo:hover {
  1020. background-color: rgba(0, 0, 0, 0.1)
  1021. }
  1022. .hw:hover {
  1023. text-decoration: underline
  1024. }
  1025. .ic:hover:not(:disabled) {
  1026. color: #156D12
  1027. }
  1028. .id:hover:not(:disabled) {
  1029. fill: #156D12
  1030. }
  1031. .ka:hover {
  1032. fill: rgba(117, 117, 117, 1)
  1033. }
  1034. .kp:hover {
  1035. fill: #000000
  1036. }
  1037. .kq:hover p {
  1038. color: #000000
  1039. }
  1040. .ku:hover:not(:disabled) svg path {
  1041. fill: #000000
  1042. }
  1043. .le:hover svg {
  1044. color: #000000
  1045. }
  1046. .nz:hover {
  1047. background-color: #F2F2F2
  1048. }
  1049. .pe:hover {
  1050. background-color: none
  1051. }
  1052. .pm:hover {
  1053. background: #F2F2F2
  1054. }
  1055. .pn:hover {
  1056. border-color: #F2F2F2
  1057. }
  1058. .po:hover {
  1059. cursor: wait
  1060. }
  1061. .pp:hover {
  1062. color: #F2F2F2
  1063. }
  1064. .pq:hover {
  1065. fill: #F2F2F2
  1066. }
  1067. .rp:hover {
  1068. fill: rgba(25, 25, 25, 1)
  1069. }
  1070. .bd:focus-within path {
  1071. fill: #242424
  1072. }
  1073. .ga:focus {
  1074. transform: scale(1.01)
  1075. }
  1076. .jz:focus {
  1077. fill: rgba(117, 117, 117, 1)
  1078. }
  1079. .kv:focus svg path {
  1080. fill: #000000
  1081. }
  1082. .lf:focus svg {
  1083. color: #000000
  1084. }
  1085. .kf:active {
  1086. border-style: none
  1087. }
  1088. </style>
  1089. <style type="text/css" data-fela-rehydration="498" data-fela-type="RULE" media="all and (min-width: 1080px)">
  1090. .d {
  1091. display: none
  1092. }
  1093. .bw {
  1094. width: 64px
  1095. }
  1096. .cg {
  1097. margin: 0 64px
  1098. }
  1099. .cv {
  1100. height: 48px
  1101. }
  1102. .dc {
  1103. margin-bottom: 52px
  1104. }
  1105. .do {
  1106. margin-bottom: 48px
  1107. }
  1108. .eb {
  1109. display: flex
  1110. }
  1111. .eu {
  1112. margin-bottom: 50px
  1113. }
  1114. .ey {
  1115. max-width: 680px
  1116. }
  1117. .fv {
  1118. margin-top: 40px
  1119. }
  1120. .hb {
  1121. font-size: 42px
  1122. }
  1123. .hc {
  1124. margin-top: 1em
  1125. }
  1126. .hd {
  1127. margin-bottom: 32px
  1128. }
  1129. .he {
  1130. line-height: 52px
  1131. }
  1132. .hf {
  1133. letter-spacing: -0.011em
  1134. }
  1135. .hk {
  1136. align-items: center
  1137. }
  1138. .iw {
  1139. border-top: solid 1px #F2F2F2
  1140. }
  1141. .ix {
  1142. border-bottom: solid 1px #F2F2F2
  1143. }
  1144. .iy {
  1145. margin: 32px 0 0
  1146. }
  1147. .iz {
  1148. padding: 3px 8px
  1149. }
  1150. .ji>* {
  1151. margin-right: 24px
  1152. }
  1153. .jj> :last-child {
  1154. margin-right: 0
  1155. }
  1156. .km {
  1157. margin-top: 0px
  1158. }
  1159. .lc {
  1160. margin: 0
  1161. }
  1162. .mn {
  1163. font-size: 20px
  1164. }
  1165. .mo {
  1166. margin-top: 2.14em
  1167. }
  1168. .mp {
  1169. line-height: 32px
  1170. }
  1171. .mq {
  1172. letter-spacing: -0.003em
  1173. }
  1174. .mw {
  1175. margin-top: 56px
  1176. }
  1177. .nr {
  1178. margin-top: 1.14em
  1179. }
  1180. .oo {
  1181. display: inline-block
  1182. }
  1183. .or {
  1184. flex-direction: row
  1185. }
  1186. .ou {
  1187. margin-bottom: 0
  1188. }
  1189. .ov {
  1190. margin-right: 20px
  1191. }
  1192. .qb {
  1193. max-width: 500px
  1194. }
  1195. .qs {
  1196. line-height: 24px
  1197. }
  1198. .qt {
  1199. letter-spacing: 0
  1200. }
  1201. .rk {
  1202. font-size: 24px
  1203. }
  1204. .rl {
  1205. line-height: 30px
  1206. }
  1207. .rm {
  1208. letter-spacing: -0.016em
  1209. }
  1210. .ru {
  1211. margin: 40px 0 0
  1212. }
  1213. .rz {
  1214. padding-top: 72px
  1215. }
  1216. </style>
  1217. <style type="text/css" data-fela-rehydration="498" data-fela-type="RULE" media="all and (max-width: 1079.98px)">
  1218. .e {
  1219. display: none
  1220. }
  1221. .kl {
  1222. margin-top: 0px
  1223. }
  1224. .on {
  1225. display: inline-block
  1226. }
  1227. </style>
  1228. <style type="text/css" data-fela-rehydration="498" data-fela-type="RULE" media="all and (max-width: 903.98px)">
  1229. .f {
  1230. display: none
  1231. }
  1232. .kk {
  1233. margin-top: 0px
  1234. }
  1235. .om {
  1236. display: inline-block
  1237. }
  1238. </style>
  1239. <style type="text/css" data-fela-rehydration="498" data-fela-type="RULE" media="all and (max-width: 727.98px)">
  1240. .g {
  1241. display: none
  1242. }
  1243. .ki {
  1244. margin-top: 0px
  1245. }
  1246. .kj {
  1247. margin-right: 0px
  1248. }
  1249. .ol {
  1250. display: inline-block
  1251. }
  1252. </style>
  1253. <style type="text/css" data-fela-rehydration="498" data-fela-type="RULE" media="all and (max-width: 551.98px)">
  1254. .h {
  1255. display: none
  1256. }
  1257. .s {
  1258. display: flex
  1259. }
  1260. .t {
  1261. justify-content: space-between
  1262. }
  1263. .bs {
  1264. width: 24px
  1265. }
  1266. .cc {
  1267. margin: 0 24px
  1268. }
  1269. .cr {
  1270. height: 40px
  1271. }
  1272. .cy {
  1273. margin-bottom: 44px
  1274. }
  1275. .dk {
  1276. margin-bottom: 32px
  1277. }
  1278. .dt {
  1279. justify-content: center
  1280. }
  1281. .eq {
  1282. margin-bottom: 2px
  1283. }
  1284. .fr {
  1285. margin-top: 32px
  1286. }
  1287. .gh {
  1288. font-size: 32px
  1289. }
  1290. .gi {
  1291. margin-top: 1.01em
  1292. }
  1293. .gj {
  1294. margin-bottom: 24px
  1295. }
  1296. .gk {
  1297. line-height: 38px
  1298. }
  1299. .gl {
  1300. letter-spacing: -0.014em
  1301. }
  1302. .hg {
  1303. align-items: flex-start
  1304. }
  1305. .if {
  1306. flex-direction: column
  1307. }
  1308. .ik {
  1309. margin: 24px -24px 0
  1310. }
  1311. .il {
  1312. padding: 0
  1313. }
  1314. .ja>* {
  1315. margin-right: 8px
  1316. }
  1317. .jb> :last-child {
  1318. margin-right: 24px
  1319. }
  1320. .jt {
  1321. margin-left: 0px
  1322. }
  1323. .kg {
  1324. margin-top: 0px
  1325. }
  1326. .kh {
  1327. margin-right: 0px
  1328. }
  1329. .ky {
  1330. margin: 0
  1331. }
  1332. .lg {
  1333. border: 1px solid #F2F2F2
  1334. }
  1335. .lh {
  1336. border-radius: 99em
  1337. }
  1338. .li {
  1339. padding: 0px 16px 0px 12px
  1340. }
  1341. .lj {
  1342. height: 38px
  1343. }
  1344. .lk {
  1345. align-items: center
  1346. }
  1347. .lm svg {
  1348. margin-right: 8px
  1349. }
  1350. .lx {
  1351. font-size: 18px
  1352. }
  1353. .ly {
  1354. margin-top: 1.56em
  1355. }
  1356. .lz {
  1357. line-height: 28px
  1358. }
  1359. .ma {
  1360. letter-spacing: -0.003em
  1361. }
  1362. .ms {
  1363. margin-top: 40px
  1364. }
  1365. .nn {
  1366. margin-top: 1.34em
  1367. }
  1368. .ok {
  1369. display: inline-block
  1370. }
  1371. .pc {
  1372. margin-bottom: 20px
  1373. }
  1374. .pd {
  1375. margin-right: 0
  1376. }
  1377. .qf {
  1378. max-width: 100%
  1379. }
  1380. .qi {
  1381. font-size: 24px
  1382. }
  1383. .qj {
  1384. line-height: 30px
  1385. }
  1386. .qk {
  1387. letter-spacing: -0.016em
  1388. }
  1389. .qy {
  1390. font-size: 20px
  1391. }
  1392. .qz {
  1393. line-height: 24px
  1394. }
  1395. .ra {
  1396. letter-spacing: 0
  1397. }
  1398. .rq {
  1399. margin: 32px 0 0
  1400. }
  1401. .rv {
  1402. padding-top: 48px
  1403. }
  1404. .ll:hover {
  1405. border-color: #E5E5E5
  1406. }
  1407. </style>
  1408. <style type="text/css" data-fela-rehydration="498" data-fela-type="RULE"
  1409. media="all and (min-width: 904px) and (max-width: 1079.98px)">
  1410. .i {
  1411. display: none
  1412. }
  1413. .bv {
  1414. width: 64px
  1415. }
  1416. .cf {
  1417. margin: 0 64px
  1418. }
  1419. .cu {
  1420. height: 48px
  1421. }
  1422. .db {
  1423. margin-bottom: 52px
  1424. }
  1425. .dn {
  1426. margin-bottom: 48px
  1427. }
  1428. .ea {
  1429. display: flex
  1430. }
  1431. .et {
  1432. margin-bottom: 50px
  1433. }
  1434. .ex {
  1435. max-width: 680px
  1436. }
  1437. .fu {
  1438. margin-top: 40px
  1439. }
  1440. .gw {
  1441. font-size: 42px
  1442. }
  1443. .gx {
  1444. margin-top: 1em
  1445. }
  1446. .gy {
  1447. margin-bottom: 32px
  1448. }
  1449. .gz {
  1450. line-height: 52px
  1451. }
  1452. .ha {
  1453. letter-spacing: -0.011em
  1454. }
  1455. .hj {
  1456. align-items: center
  1457. }
  1458. .is {
  1459. border-top: solid 1px #F2F2F2
  1460. }
  1461. .it {
  1462. border-bottom: solid 1px #F2F2F2
  1463. }
  1464. .iu {
  1465. margin: 32px 0 0
  1466. }
  1467. .iv {
  1468. padding: 3px 8px
  1469. }
  1470. .jg>* {
  1471. margin-right: 24px
  1472. }
  1473. .jh> :last-child {
  1474. margin-right: 0
  1475. }
  1476. .lb {
  1477. margin: 0
  1478. }
  1479. .mj {
  1480. font-size: 20px
  1481. }
  1482. .mk {
  1483. margin-top: 2.14em
  1484. }
  1485. .ml {
  1486. line-height: 32px
  1487. }
  1488. .mm {
  1489. letter-spacing: -0.003em
  1490. }
  1491. .mv {
  1492. margin-top: 56px
  1493. }
  1494. .nq {
  1495. margin-top: 1.14em
  1496. }
  1497. .os {
  1498. flex-direction: row
  1499. }
  1500. .ow {
  1501. margin-bottom: 0
  1502. }
  1503. .ox {
  1504. margin-right: 20px
  1505. }
  1506. .qc {
  1507. max-width: 500px
  1508. }
  1509. .qq {
  1510. line-height: 24px
  1511. }
  1512. .qr {
  1513. letter-spacing: 0
  1514. }
  1515. .rh {
  1516. font-size: 24px
  1517. }
  1518. .ri {
  1519. line-height: 30px
  1520. }
  1521. .rj {
  1522. letter-spacing: -0.016em
  1523. }
  1524. .rt {
  1525. margin: 40px 0 0
  1526. }
  1527. .ry {
  1528. padding-top: 72px
  1529. }
  1530. </style>
  1531. <style type="text/css" data-fela-rehydration="498" data-fela-type="RULE"
  1532. media="all and (min-width: 728px) and (max-width: 903.98px)">
  1533. .j {
  1534. display: none
  1535. }
  1536. .w {
  1537. display: flex
  1538. }
  1539. .x {
  1540. justify-content: space-between
  1541. }
  1542. .bu {
  1543. width: 64px
  1544. }
  1545. .ce {
  1546. margin: 0 48px
  1547. }
  1548. .ct {
  1549. height: 48px
  1550. }
  1551. .da {
  1552. margin-bottom: 52px
  1553. }
  1554. .dm {
  1555. margin-bottom: 48px
  1556. }
  1557. .dv {
  1558. justify-content: center
  1559. }
  1560. .es {
  1561. margin-bottom: 50px
  1562. }
  1563. .ew {
  1564. max-width: 680px
  1565. }
  1566. .ft {
  1567. margin-top: 40px
  1568. }
  1569. .gr {
  1570. font-size: 42px
  1571. }
  1572. .gs {
  1573. margin-top: 1em
  1574. }
  1575. .gt {
  1576. margin-bottom: 32px
  1577. }
  1578. .gu {
  1579. line-height: 52px
  1580. }
  1581. .gv {
  1582. letter-spacing: -0.011em
  1583. }
  1584. .hi {
  1585. align-items: center
  1586. }
  1587. .io {
  1588. border-top: solid 1px #F2F2F2
  1589. }
  1590. .ip {
  1591. border-bottom: solid 1px #F2F2F2
  1592. }
  1593. .iq {
  1594. margin: 32px 0 0
  1595. }
  1596. .ir {
  1597. padding: 3px 8px
  1598. }
  1599. .je>* {
  1600. margin-right: 24px
  1601. }
  1602. .jf> :last-child {
  1603. margin-right: 0
  1604. }
  1605. .la {
  1606. margin: 0
  1607. }
  1608. .mf {
  1609. font-size: 20px
  1610. }
  1611. .mg {
  1612. margin-top: 2.14em
  1613. }
  1614. .mh {
  1615. line-height: 32px
  1616. }
  1617. .mi {
  1618. letter-spacing: -0.003em
  1619. }
  1620. .mu {
  1621. margin-top: 56px
  1622. }
  1623. .np {
  1624. margin-top: 1.14em
  1625. }
  1626. .ot {
  1627. flex-direction: row
  1628. }
  1629. .oy {
  1630. margin-bottom: 0
  1631. }
  1632. .oz {
  1633. margin-right: 20px
  1634. }
  1635. .qd {
  1636. max-width: 500px
  1637. }
  1638. .qo {
  1639. line-height: 24px
  1640. }
  1641. .qp {
  1642. letter-spacing: 0
  1643. }
  1644. .re {
  1645. font-size: 24px
  1646. }
  1647. .rf {
  1648. line-height: 30px
  1649. }
  1650. .rg {
  1651. letter-spacing: -0.016em
  1652. }
  1653. .rs {
  1654. margin: 40px 0 0
  1655. }
  1656. .rx {
  1657. padding-top: 72px
  1658. }
  1659. </style>
  1660. <style type="text/css" data-fela-rehydration="498" data-fela-type="RULE"
  1661. media="all and (min-width: 552px) and (max-width: 727.98px)">
  1662. .k {
  1663. display: none
  1664. }
  1665. .u {
  1666. display: flex
  1667. }
  1668. .v {
  1669. justify-content: space-between
  1670. }
  1671. .bt {
  1672. width: 24px
  1673. }
  1674. .cd {
  1675. margin: 0 24px
  1676. }
  1677. .cs {
  1678. height: 40px
  1679. }
  1680. .cz {
  1681. margin-bottom: 44px
  1682. }
  1683. .dl {
  1684. margin-bottom: 32px
  1685. }
  1686. .du {
  1687. justify-content: center
  1688. }
  1689. .er {
  1690. margin-bottom: 2px
  1691. }
  1692. .fs {
  1693. margin-top: 32px
  1694. }
  1695. .gm {
  1696. font-size: 32px
  1697. }
  1698. .gn {
  1699. margin-top: 1.01em
  1700. }
  1701. .go {
  1702. margin-bottom: 24px
  1703. }
  1704. .gp {
  1705. line-height: 38px
  1706. }
  1707. .gq {
  1708. letter-spacing: -0.014em
  1709. }
  1710. .hh {
  1711. align-items: flex-start
  1712. }
  1713. .ig {
  1714. flex-direction: column
  1715. }
  1716. .im {
  1717. margin: 24px 0 0
  1718. }
  1719. .in {
  1720. padding: 0
  1721. }
  1722. .jc>* {
  1723. margin-right: 8px
  1724. }
  1725. .jd> :last-child {
  1726. margin-right: 8px
  1727. }
  1728. .ju {
  1729. margin-left: 0px
  1730. }
  1731. .kz {
  1732. margin: 0
  1733. }
  1734. .ln {
  1735. border: 1px solid #F2F2F2
  1736. }
  1737. .lo {
  1738. border-radius: 99em
  1739. }
  1740. .lp {
  1741. padding: 0px 16px 0px 12px
  1742. }
  1743. .lq {
  1744. height: 38px
  1745. }
  1746. .lr {
  1747. align-items: center
  1748. }
  1749. .lt svg {
  1750. margin-right: 8px
  1751. }
  1752. .mb {
  1753. font-size: 18px
  1754. }
  1755. .mc {
  1756. margin-top: 1.56em
  1757. }
  1758. .md {
  1759. line-height: 28px
  1760. }
  1761. .me {
  1762. letter-spacing: -0.003em
  1763. }
  1764. .mt {
  1765. margin-top: 40px
  1766. }
  1767. .no {
  1768. margin-top: 1.34em
  1769. }
  1770. .pa {
  1771. margin-bottom: 20px
  1772. }
  1773. .pb {
  1774. margin-right: 0
  1775. }
  1776. .qe {
  1777. max-width: 100%
  1778. }
  1779. .ql {
  1780. font-size: 24px
  1781. }
  1782. .qm {
  1783. line-height: 30px
  1784. }
  1785. .qn {
  1786. letter-spacing: -0.016em
  1787. }
  1788. .rb {
  1789. font-size: 20px
  1790. }
  1791. .rc {
  1792. line-height: 24px
  1793. }
  1794. .rd {
  1795. letter-spacing: 0
  1796. }
  1797. .rr {
  1798. margin: 32px 0 0
  1799. }
  1800. .rw {
  1801. padding-top: 48px
  1802. }
  1803. .ls:hover {
  1804. border-color: #E5E5E5
  1805. }
  1806. </style>
  1807. <style type="text/css" data-fela-rehydration="498" data-fela-type="RULE" media="print">
  1808. .oi {
  1809. display: none
  1810. }
  1811. </style>
  1812. <style type="text/css" data-fela-rehydration="498" data-fela-type="RULE"
  1813. media="(prefers-reduced-motion: no-preference)">
  1814. .fx {
  1815. transition: transform 300ms cubic-bezier(0.2, 0, 0.2, 1)
  1816. }
  1817. </style>
  1818. </head>
  1819. <body>
  1820. <div id="root">
  1821. <div class="a b c">
  1822. <div class="d e f g h i j k"></div>
  1823. <script>document.domain = document.domain;</script>
  1824. <div class="l c">
  1825. <div class="l m n o c">
  1826. <div class="am q r s dt u du w dv i d y z"><a
  1827. class="dx ag dy bf ak b am an ao ap aq ar as at s u w i d q dz z"
  1828. href="https://rsci.app.link/?%24canonical_url=https%3A%2F%2Fmedium.com%2Fp%2F729615b3528c&amp;%7Efeature=LiOpenInAppButton&amp;%7Echannel=ShowPostUnderUser&amp;source=---top_nav_layout_nav----------------------------------"
  1829. rel="noopener follow">Open in app<svg xmlns="http://www.w3.org/2000/svg" width="10" height="10"
  1830. fill="none" viewBox="0 0 10 10" class="dw">
  1831. <path fill="currentColor"
  1832. d="M.985 8.485a.375.375 0 1 0 .53.53zM8.75 1.25h.375A.375.375 0 0 0 8.75.875zM8.375 6.5a.375.375 0 1 0 .75 0zM3.5.875a.375.375 0 1 0 0 .75zm-1.985 8.14 7.5-7.5-.53-.53-7.5 7.5zm6.86-7.765V6.5h.75V1.25zM3.5 1.625h5.25v-.75H3.5z">
  1833. </path>
  1834. </svg></a></div>
  1835. <div class="p q r ab ac">
  1836. <div class="ab q ae"><a class="af ag ah ai aj ak al am an ao ap aq ar as at ab" aria-label="Homepage"
  1837. data-testid="headerMediumLogo" rel="noopener follow"
  1838. href="/?source=---top_nav_layout_nav----------------------------------"><svg
  1839. xmlns="http://www.w3.org/2000/svg" width="719" height="160" fill="none" viewBox="0 0 719 160"
  1840. class="au av aw">
  1841. <path fill="#242424"
  1842. d="m174.104 9.734.215-.047V8.02H130.39L89.6 103.89 48.81 8.021H1.472v1.666l.212.047c8.018 1.81 12.09 4.509 12.09 14.242V137.93c0 9.734-4.087 12.433-12.106 14.243l-.212.047v1.671h32.118v-1.665l-.213-.048c-8.018-1.809-12.089-4.509-12.089-14.242V30.586l52.399 123.305h2.972l53.925-126.743V140.75c-.687 7.688-4.721 10.062-11.982 11.701l-.215.05v1.652h55.948v-1.652l-.215-.05c-7.269-1.639-11.4-4.013-12.087-11.701l-.037-116.774h.037c0-9.733 4.071-12.432 12.087-14.242m25.555 75.488c.915-20.474 8.268-35.252 20.606-35.507 3.806.063 6.998 1.312 9.479 3.714 5.272 5.118 7.751 15.812 7.368 31.793zm-.553 5.77h65.573v-.275c-.186-15.656-4.721-27.834-13.466-36.196-7.559-7.227-18.751-11.203-30.507-11.203h-.263c-6.101 0-13.584 1.48-18.909 4.16-6.061 2.807-11.407 7.003-15.855 12.511-7.161 8.874-11.499 20.866-12.554 34.343q-.05.606-.092 1.212a50 50 0 0 0-.065 1.151 85.807 85.807 0 0 0-.094 5.689c.71 30.524 17.198 54.917 46.483 54.917 25.705 0 40.675-18.791 44.407-44.013l-1.886-.664c-6.557 13.556-18.334 21.771-31.738 20.769-18.297-1.369-32.314-19.922-31.042-42.395m139.722 41.359c-2.151 5.101-6.639 7.908-12.653 7.908s-11.513-4.129-15.418-11.63c-4.197-8.053-6.405-19.436-6.405-32.92 0-28.067 8.729-46.22 22.24-46.22 5.657 0 10.111 2.807 12.236 7.704zm43.499 20.008c-8.019-1.897-12.089-4.722-12.089-14.951V1.309l-48.716 14.353v1.757l.299-.024c6.72-.543 11.278.386 13.925 2.83 2.072 1.915 3.082 4.853 3.082 8.987v18.66c-4.803-3.067-10.516-4.56-17.448-4.56-14.059 0-26.909 5.92-36.176 16.672-9.66 11.205-14.767 26.518-14.767 44.278-.003 31.72 15.612 53.039 38.851 53.039 13.595 0 24.533-7.449 29.54-20.013v16.865h43.711v-1.746zM424.1 19.819c0-9.904-7.468-17.374-17.375-17.374-9.859 0-17.573 7.632-17.573 17.374s7.721 17.374 17.573 17.374c9.907 0 17.375-7.47 17.375-17.374m11.499 132.546c-8.019-1.897-12.089-4.722-12.089-14.951h-.035V43.635l-43.714 12.551v1.705l.263.024c9.458.842 12.047 4.1 12.047 15.152v81.086h43.751v-1.746zm112.013 0c-8.018-1.897-12.089-4.722-12.089-14.951V43.635l-41.621 12.137v1.71l.246.026c7.733.813 9.967 4.257 9.967 15.36v59.279c-2.578 5.102-7.415 8.131-13.274 8.336-9.503 0-14.736-6.419-14.736-18.073V43.638l-43.714 12.55v1.703l.262.024c9.459.84 12.05 4.097 12.05 15.152v50.17a56.3 56.3 0 0 0 .91 10.444l.787 3.423c3.701 13.262 13.398 20.197 28.59 20.197 12.868 0 24.147-7.966 29.115-20.43v17.311h43.714v-1.747zm169.818 1.788v-1.749l-.213-.05c-8.7-2.006-12.089-5.789-12.089-13.49v-63.79c0-19.89-11.171-31.761-29.883-31.761-13.64 0-25.141 7.882-29.569 20.16-3.517-13.01-13.639-20.16-28.606-20.16-13.146 0-23.449 6.938-27.869 18.657V43.643L545.487 55.68v1.715l.263.024c9.345.829 12.047 4.181 12.047 14.95v81.784h40.787v-1.746l-.215-.053c-6.941-1.631-9.181-4.606-9.181-12.239V66.998c1.836-4.289 5.537-9.37 12.853-9.37 9.086 0 13.692 6.296 13.692 18.697v77.828h40.797v-1.746l-.215-.053c-6.94-1.631-9.18-4.606-9.18-12.239V75.066a42 42 0 0 0-.578-7.26c1.947-4.661 5.86-10.177 13.475-10.177 9.214 0 13.691 6.114 13.691 18.696v77.828z">
  1843. </path>
  1844. </svg></a>
  1845. <div class="ax h">
  1846. <div class="ab ay az ba bb q bc bd">
  1847. <div class="bm" aria-hidden="false" aria-describedby="searchResults" aria-labelledby="searchResults">
  1848. </div>
  1849. <div class="bn bo ab"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none"
  1850. viewBox="0 0 24 24">
  1851. <path fill="currentColor" fill-rule="evenodd"
  1852. d="M4.092 11.06a6.95 6.95 0 1 1 13.9 0 6.95 6.95 0 0 1-13.9 0m6.95-8.05a8.05 8.05 0 1 0 5.13 14.26l3.75 3.75a.56.56 0 1 0 .79-.79l-3.73-3.73A8.05 8.05 0 0 0 11.042 3z"
  1853. clip-rule="evenodd"></path>
  1854. </svg></div><input role="combobox" aria-controls="searchResults" aria-expanded="false"
  1855. aria-label="search" data-testid="headerSearchInput" tabindex="0"
  1856. class="ay be bf bg z bh bi bj bk bl" placeholder="Search" value="" />
  1857. </div>
  1858. </div>
  1859. </div>
  1860. <div class="h k w ea eb">
  1861. <div class="ec ab"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerWriteButton"
  1862. href="https://medium.com/new-story?source=---top_nav_layout_nav----------------------------------"
  1863. rel="noopener follow">
  1864. <div class="bf b bg z dx ed ee ab q ef eg"><svg xmlns="http://www.w3.org/2000/svg" width="24"
  1865. height="24" fill="none" viewBox="0 0 24 24" aria-label="Write">
  1866. <path fill="currentColor"
  1867. d="M14 4a.5.5 0 0 0 0-1zm7 6a.5.5 0 0 0-1 0zm-7-7H4v1h10zM3 4v16h1V4zm1 17h16v-1H4zm17-1V10h-1v10zm-1 1a1 1 0 0 0 1-1h-1zM3 20a1 1 0 0 0 1 1v-1zM4 3a1 1 0 0 0-1 1h1z">
  1868. </path>
  1869. <path stroke="currentColor"
  1870. d="m17.5 4.5-8.458 8.458a.25.25 0 0 0-.06.098l-.824 2.47a.25.25 0 0 0 .316.316l2.47-.823a.25.25 0 0 0 .098-.06L19.5 6.5m-2-2 2.323-2.323a.25.25 0 0 1 .354 0l1.646 1.646a.25.25 0 0 1 0 .354L19.5 6.5m-2-2 2 2">
  1871. </path>
  1872. </svg>
  1873. <div class="dw l">Write</div>
  1874. </div>
  1875. </a></div>
  1876. </div>
  1877. <div class="k j i d">
  1878. <div class="ec ab"><a class="af ag ah ai aj ak al am an ao ap aq ar as at"
  1879. data-testid="headerSearchButton" rel="noopener follow"
  1880. href="/search?source=---top_nav_layout_nav----------------------------------">
  1881. <div class="bf b bg z dx ed ee ab q ef eg"><svg xmlns="http://www.w3.org/2000/svg" width="24"
  1882. height="24" fill="none" viewBox="0 0 24 24" aria-label="Search">
  1883. <path fill="currentColor" fill-rule="evenodd"
  1884. d="M4.092 11.06a6.95 6.95 0 1 1 13.9 0 6.95 6.95 0 0 1-13.9 0m6.95-8.05a8.05 8.05 0 1 0 5.13 14.26l3.75 3.75a.56.56 0 1 0 .79-.79l-3.73-3.73A8.05 8.05 0 0 0 11.042 3z"
  1885. clip-rule="evenodd"></path>
  1886. </svg></div>
  1887. </a></div>
  1888. </div>
  1889. <div class="ec ab"><a class="af ag ah ai aj ak al am an ao ap aq ar as at"
  1890. data-testid="headerNotificationButton" rel="noopener follow"
  1891. href="/me/notifications?source=---top_nav_layout_nav----------------------------------">
  1892. <div class="bf b bg z dx ed ee ab q ef eg"><svg xmlns="http://www.w3.org/2000/svg" width="24"
  1893. height="24" fill="none" viewBox="0 0 24 24" aria-label="Notifications">
  1894. <path stroke="currentColor" stroke-linecap="round" d="M15 18.5a3 3 0 1 1-6 0"></path>
  1895. <path stroke="currentColor" stroke-linejoin="round"
  1896. d="M5.5 10.532V9a6.5 6.5 0 0 1 13 0v1.532c0 1.42.564 2.782 1.568 3.786l.032.032c.256.256.4.604.4.966v2.934a.25.25 0 0 1-.25.25H3.75a.25.25 0 0 1-.25-.25v-2.934c0-.363.144-.71.4-.966l.032-.032A5.35 5.35 0 0 0 5.5 10.532Z">
  1897. </path>
  1898. </svg></div>
  1899. </a></div>
  1900. <div class="l" aria-hidden="false"><button class="ay eh am ab q ao ei ej ek" aria-label="user options menu"
  1901. data-testid="headerUserIcon">
  1902. <div class="l ed">
  1903. <div class="l ed"><img alt="Guoziyun" class="l ep by bz ca cx"
  1904. src="https://miro.medium.com/v2/resize:fill:64:64/0*tPpe_E0eT2MCh2h2" width="32" height="32"
  1905. loading="lazy" />
  1906. <div class="el by l bz ca em n ay eo"></div>
  1907. </div>
  1908. </div>
  1909. </button></div>
  1910. </div>
  1911. </div>
  1912. <div class="l">
  1913. <div class="eq er es et eu l">
  1914. <div class="ab cb">
  1915. <div class="ci bh ev ew ex ey"></div>
  1916. </div>
  1917. <article>
  1918. <div class="l">
  1919. <div class="l"><span class="l"></span>
  1920. <section>
  1921. <div>
  1922. <div class="em fe ff fg fh fi"></div>
  1923. <div class="fj fk fl fm fn">
  1924. <div class="ab cb">
  1925. <div class="ci bh ev ew ex ey">
  1926. <figure class="fr fs ft fu fv fw fo fp paragraph-image">
  1927. <div role="button" tabindex="0" class="fx fy ed fz bh ga">
  1928. <div class="fo fp fq">
  1929. <picture>
  1930. <source
  1931. srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/1*9-tDBevuDRdN2pMUN5GJhg.png 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/1*9-tDBevuDRdN2pMUN5GJhg.png 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/1*9-tDBevuDRdN2pMUN5GJhg.png 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/1*9-tDBevuDRdN2pMUN5GJhg.png 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/1*9-tDBevuDRdN2pMUN5GJhg.png 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/1*9-tDBevuDRdN2pMUN5GJhg.png 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/1*9-tDBevuDRdN2pMUN5GJhg.png 1400w"
  1932. sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px"
  1933. type="image/webp" />
  1934. <source data-testid="og"
  1935. srcSet="https://miro.medium.com/v2/resize:fit:640/1*9-tDBevuDRdN2pMUN5GJhg.png 640w, https://miro.medium.com/v2/resize:fit:720/1*9-tDBevuDRdN2pMUN5GJhg.png 720w, https://miro.medium.com/v2/resize:fit:750/1*9-tDBevuDRdN2pMUN5GJhg.png 750w, https://miro.medium.com/v2/resize:fit:786/1*9-tDBevuDRdN2pMUN5GJhg.png 786w, https://miro.medium.com/v2/resize:fit:828/1*9-tDBevuDRdN2pMUN5GJhg.png 828w, https://miro.medium.com/v2/resize:fit:1100/1*9-tDBevuDRdN2pMUN5GJhg.png 1100w, https://miro.medium.com/v2/resize:fit:1400/1*9-tDBevuDRdN2pMUN5GJhg.png 1400w"
  1936. sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px" />
  1937. <img alt="" class="bh gb gc c" width="700" height="367" loading="eager"
  1938. role="presentation" />
  1939. </picture>
  1940. </div>
  1941. </div>
  1942. </figure>
  1943. <div>
  1944. <h1 id="d09a"
  1945. class="pw-post-title gd ge gf bf gg gh gi gj gk gl gm gn go gp gq gr gs gt gu gv gw gx gy gz ha hb hc hd he hf bk"
  1946. data-testid="storyTitle">Using DiffUtil.ItemCallback for Efficient RecyclerView Updates
  1947. </h1>
  1948. <div>
  1949. <div class="speechify-ignore ab cp">
  1950. <div class="speechify-ignore bh l">
  1951. <div class="hg hh hi hj hk ab">
  1952. <div>
  1953. <div class="ab hl">
  1954. <div>
  1955. <div class="bm" aria-hidden="false"><a rel="noopener follow"
  1956. href="/@sandeepkella23?source=post_page---byline--729615b3528c--------------------------------">
  1957. <div class="l hm hn by ho hp">
  1958. <div class="l ed"><img alt="Sandeep Kella" class="l ep by dd de cx"
  1959. src="https://miro.medium.com/v2/resize:fill:88:88/1*m4ij-Lr2ZViGgYmypjtQ9A.png"
  1960. width="44" height="44" loading="lazy" data-testid="authorPhoto" />
  1961. <div class="hq by l dd de em n hr eo"></div>
  1962. </div>
  1963. </div>
  1964. </a></div>
  1965. </div>
  1966. </div>
  1967. </div>
  1968. <div class="bn bh l">
  1969. <div class="ab">
  1970. <div style="flex:1"><span class="bf b bg z bk">
  1971. <div class="hs ab q">
  1972. <div class="ab q ht">
  1973. <div class="ab q">
  1974. <div>
  1975. <div class="bm" aria-hidden="false">
  1976. <p class="bf b hu hv bk"><a
  1977. class="af ag ah ai aj ak al am an ao ap aq ar hw"
  1978. data-testid="authorName" rel="noopener follow"
  1979. href="/@sandeepkella23?source=post_page---byline--729615b3528c--------------------------------">Sandeep
  1980. Kella</a></p>
  1981. </div>
  1982. </div>
  1983. </div><span class="hx hy" aria-hidden="true"><span
  1984. class="bf b bg z dx">·</span></span>
  1985. <p class="bf b hu hv dx"><button
  1986. class="hz ia ah ai aj ak al am an ao ap aq ar ib ic id"
  1987. disabled="">Follow</button></p>
  1988. </div>
  1989. </div>
  1990. </span></div>
  1991. </div>
  1992. <div class="l ie"><span class="bf b bg z dx">
  1993. <div class="ab cn if ig ih"><span class="bf b bg z dx">
  1994. <div class="ab ae"><span data-testid="storyReadTime">2 min read</span>
  1995. <div class="ii ij l" aria-hidden="true"><span class="l"
  1996. aria-hidden="true"><span class="bf b bg z dx">·</span></span>
  1997. </div><span data-testid="storyPublishDate">May 15, 2024</span>
  1998. </div>
  1999. </span></div>
  2000. </span></div>
  2001. </div>
  2002. </div>
  2003. <div class="ab cp ik il im in io ip iq ir is it iu iv iw ix iy iz">
  2004. <div class="h k w ea eb q">
  2005. <div class="jp l">
  2006. <div class="ab q jq jr">
  2007. <div class="pw-multi-vote-icon ed js jt ju jv">
  2008. <div class="">
  2009. <div class="jw jx jy jz ka kb kc am kd ke kf jv"><svg
  2010. xmlns="http://www.w3.org/2000/svg" width="24" height="24"
  2011. viewBox="0 0 24 24" aria-label="clap">
  2012. <path fill-rule="evenodd"
  2013. d="M11.37.828 12 3.282l.63-2.454zM15.421 1.84l-1.185-.388-.338 2.5zM9.757 1.452l-1.184.389 1.523 2.112zM20.253 11.84 17.75 7.438c-.238-.353-.57-.584-.93-.643a.96.96 0 0 0-.753.183 1.13 1.13 0 0 0-.443.695c.014.019.03.033.044.053l2.352 4.138c1.614 2.95 1.1 5.771-1.525 8.395a7 7 0 0 1-.454.415c.997-.13 1.927-.61 2.773-1.457 2.705-2.704 2.517-5.585 1.438-7.377M12.066 9.01c-.129-.687.08-1.299.573-1.773l-2.062-2.063a1.123 1.123 0 0 0-1.555 0 1.1 1.1 0 0 0-.273.521z"
  2014. clip-rule="evenodd"></path>
  2015. <path fill-rule="evenodd"
  2016. d="M14.741 8.309c-.18-.267-.446-.455-.728-.502a.67.67 0 0 0-.533.127c-.146.113-.59.458-.199 1.296l1.184 2.503a.448.448 0 0 1-.236.755.445.445 0 0 1-.483-.248L7.614 6.106A.816.816 0 1 0 6.459 7.26l3.643 3.644a.446.446 0 1 1-.631.63L5.83 7.896l-1.03-1.03a.82.82 0 0 0-1.395.577.81.81 0 0 0 .24.576l1.027 1.028 3.643 3.643a.444.444 0 0 1-.144.728.44.44 0 0 1-.486-.098l-3.64-3.64a.82.82 0 0 0-1.335.263.81.81 0 0 0 .178.89l1.535 1.534 2.287 2.288a.445.445 0 0 1-.63.63l-2.287-2.288a.813.813 0 0 0-1.393.578c0 .216.086.424.238.577l4.403 4.403c2.79 2.79 5.495 4.119 8.681.931 2.269-2.271 2.708-4.588 1.342-7.086z"
  2017. clip-rule="evenodd"></path>
  2018. </svg></div>
  2019. </div>
  2020. </div>
  2021. <div class="pw-multi-vote-count l kg kh ki kj kk kl km">
  2022. <p class="bf b dy z dx"><span class="jx">--</span></p>
  2023. </div>
  2024. </div>
  2025. </div>
  2026. <div>
  2027. <div class="bm" aria-hidden="false"><button class="ao jw kn ko ab q ee kp kq"
  2028. aria-label="responses"><svg xmlns="http://www.w3.org/2000/svg" width="24"
  2029. height="24" viewBox="0 0 24 24" class="kr">
  2030. <path
  2031. d="M18.006 16.803c1.533-1.456 2.234-3.325 2.234-5.321C20.24 7.357 16.709 4 12.191 4S4 7.357 4 11.482c0 4.126 3.674 7.482 8.191 7.482.817 0 1.622-.111 2.393-.327.231.2.48.391.744.559 1.06.693 2.203 1.044 3.399 1.044.224-.008.4-.112.486-.287a.49.49 0 0 0-.042-.518c-.495-.67-.845-1.364-1.04-2.057a4 4 0 0 1-.125-.598zm-3.122 1.055-.067-.223-.315.096a8 8 0 0 1-2.311.338c-4.023 0-7.292-2.955-7.292-6.587 0-3.633 3.269-6.588 7.292-6.588 4.014 0 7.112 2.958 7.112 6.593 0 1.794-.608 3.469-2.027 4.72l-.195.168v.255c0 .056 0 .151.016.295.025.231.081.478.154.733.154.558.398 1.117.722 1.659a5.3 5.3 0 0 1-2.165-.845c-.276-.176-.714-.383-.941-.59z">
  2032. </path>
  2033. </svg></button></div>
  2034. </div>
  2035. </div>
  2036. <div class="ab q ja jb jc jd je jf jg jh ji jj jk jl jm jn jo">
  2037. <div class="ks k j i d"></div>
  2038. <div class="h k">
  2039. <div>
  2040. <div class="bm" aria-hidden="false"><button
  2041. aria-controls="addToCatalogBookmarkButton" aria-expanded="false"
  2042. aria-label="Add to list bookmark button"
  2043. data-testid="headerBookmarkButton"
  2044. class="af ee ah ai aj ak al kt an ao ap ib ku kv kw" disabled=""><svg
  2045. xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none"
  2046. viewBox="0 0 24 24" class="av">
  2047. <path fill="#000"
  2048. d="M17.5 1.25a.5.5 0 0 1 1 0v2.5H21a.5.5 0 0 1 0 1h-2.5v2.5a.5.5 0 0 1-1 0v-2.5H15a.5.5 0 0 1 0-1h2.5zm-11 4.5a1 1 0 0 1 1-1H11a.5.5 0 0 0 0-1H7.5a2 2 0 0 0-2 2v14a.5.5 0 0 0 .8.4l5.7-4.4 5.7 4.4a.5.5 0 0 0 .8-.4v-8.5a.5.5 0 0 0-1 0v7.48l-5.2-4a.5.5 0 0 0-.6 0l-5.2 4z">
  2049. </path>
  2050. </svg></button></div>
  2051. </div>
  2052. </div>
  2053. <div class="ep kx cn">
  2054. <div class="l ae">
  2055. <div class="ab cb">
  2056. <div class="ky kz la lb lc gb ci bh">
  2057. <div class="ab">
  2058. <div class="bm bh" aria-hidden="false">
  2059. <div>
  2060. <div class="bm" aria-hidden="false"><button aria-label="Listen"
  2061. data-testid="audioPlayButton"
  2062. class="af ee ah ai aj ak al kt an ao ap ib ld le kq lf lg lh li lj s lk ll lm ln lo lp lq u lr ls lt"><svg
  2063. xmlns="http://www.w3.org/2000/svg" width="24" height="24"
  2064. fill="none" viewBox="0 0 24 24">
  2065. <path fill="currentColor" fill-rule="evenodd"
  2066. d="M3 12a9 9 0 1 1 18 0 9 9 0 0 1-18 0m9-10C6.477 2 2 6.477 2 12s4.477 10 10 10 10-4.477 10-10S17.523 2 12 2m3.376 10.416-4.599 3.066a.5.5 0 0 1-.777-.416V8.934a.5.5 0 0 1 .777-.416l4.599 3.066a.5.5 0 0 1 0 .832"
  2067. clip-rule="evenodd"></path>
  2068. </svg>
  2069. <div class="j i d">
  2070. <p class="bf b bg z dx">Listen</p>
  2071. </div>
  2072. </button></div>
  2073. </div>
  2074. </div>
  2075. </div>
  2076. </div>
  2077. </div>
  2078. </div>
  2079. </div>
  2080. <div class="bm" aria-hidden="false" aria-describedby="postFooterSocialMenu"
  2081. aria-labelledby="postFooterSocialMenu">
  2082. <div>
  2083. <div class="bm" aria-hidden="false"><button
  2084. aria-controls="postFooterSocialMenu" aria-expanded="false"
  2085. aria-label="Share Post" data-testid="headerSocialShareButton"
  2086. class="af ee ah ai aj ak al kt an ao ap ib ld le kq lf lg lh li lj s lk ll lm ln lo lp lq u lr ls lt"><svg
  2087. xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none"
  2088. viewBox="0 0 24 24">
  2089. <path fill="currentColor" fill-rule="evenodd"
  2090. d="M15.218 4.931a.4.4 0 0 1-.118.132l.012.006a.45.45 0 0 1-.292.074.5.5 0 0 1-.3-.13l-2.02-2.02v7.07c0 .28-.23.5-.5.5s-.5-.22-.5-.5v-7.04l-2 2a.45.45 0 0 1-.57.04h-.02a.4.4 0 0 1-.16-.3.4.4 0 0 1 .1-.32l2.8-2.8a.5.5 0 0 1 .7 0l2.8 2.79a.42.42 0 0 1 .068.498m-.106.138.008.004v-.01zM16 7.063h1.5a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2h-11c-1.1 0-2-.9-2-2v-10a2 2 0 0 1 2-2H8a.5.5 0 0 1 .35.15.5.5 0 0 1 .15.35.5.5 0 0 1-.15.35.5.5 0 0 1-.35.15H6.4c-.5 0-.9.4-.9.9v10.2a.9.9 0 0 0 .9.9h11.2c.5 0 .9-.4.9-.9v-10.2c0-.5-.4-.9-.9-.9H16a.5.5 0 0 1 0-1"
  2091. clip-rule="evenodd"></path>
  2092. </svg>
  2093. <div class="j i d">
  2094. <p class="bf b bg z dx">Share</p>
  2095. </div>
  2096. </button></div>
  2097. </div>
  2098. </div>
  2099. <div class="bm" aria-hidden="false">
  2100. <div>
  2101. <div class="bm" aria-hidden="false"><button aria-label="More options"
  2102. data-testid="headerStoryOptionsButton"
  2103. class="af ee ah ai aj ak al kt an ao ap ib ld le kq lf lg lh li lj s lk ll lm ln lo lp lq u lr ls lt"><svg
  2104. xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none"
  2105. viewBox="0 0 24 24">
  2106. <path fill="currentColor" fill-rule="evenodd"
  2107. d="M4.385 12c0 .55.2 1.02.59 1.41.39.4.86.59 1.41.59s1.02-.2 1.41-.59c.4-.39.59-.86.59-1.41s-.2-1.02-.59-1.41a1.93 1.93 0 0 0-1.41-.59c-.55 0-1.02.2-1.41.59-.4.39-.59.86-.59 1.41m5.62 0c0 .55.2 1.02.58 1.41.4.4.87.59 1.42.59s1.02-.2 1.41-.59c.4-.39.59-.86.59-1.41s-.2-1.02-.59-1.41a1.93 1.93 0 0 0-1.41-.59c-.55 0-1.03.2-1.42.59s-.58.86-.58 1.41m5.6 0c0 .55.2 1.02.58 1.41.4.4.87.59 1.43.59s1.03-.2 1.42-.59.58-.86.58-1.41-.2-1.02-.58-1.41a1.93 1.93 0 0 0-1.42-.59c-.56 0-1.04.2-1.43.59s-.58.86-.58 1.41"
  2108. clip-rule="evenodd"></path>
  2109. </svg>
  2110. <div class="j i d">
  2111. <p class="bf b bg z dx">More</p>
  2112. </div>
  2113. </button></div>
  2114. </div>
  2115. </div>
  2116. </div>
  2117. </div>
  2118. </div>
  2119. </div>
  2120. </div>
  2121. </div>
  2122. <p id="384c"
  2123. class="pw-post-body-paragraph lu lv gf lw b lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr fj bk">
  2124. Here’s an explanation of DiffUtil.ItemCallback with a sample use case and code:</p>
  2125. <p id="6332"
  2126. class="pw-post-body-paragraph lu lv gf lw b lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr fj bk">
  2127. <strong class="lw gg">Use Case:</strong> Imagine you have a RecyclerView displaying a list
  2128. of tasks. When a user marks a task as complete, you want to update the UI to reflect the
  2129. change (e.g., strikethrough for completed tasks).</p>
  2130. <p id="dd75"
  2131. class="pw-post-body-paragraph lu lv gf lw b lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr fj bk">
  2132. <strong class="lw gg">DiffUtil.ItemCallback Implementation:</strong></p>
  2133. <pre
  2134. class="ms mt mu mv mw mx my mz bp na bb bk"><span id="f5c1" class="nb nc gf my b bg nd ne l nf ng">public class TaskAdapter extends RecyclerView.Adapter&lt;TaskViewHolder&gt; {<br/>private List&lt;Task&gt; tasks;<br/> public TaskAdapter(List&lt;Task&gt; tasks) {<br/> this.tasks = tasks;<br/> }<br/> @Override<br/> public TaskViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {<br/> // ... (inflate view layout for the task)<br/> return new TaskViewHolder(itemView);<br/> }<br/> @Override<br/> public void onBindViewHolder(TaskViewHolder holder, int position) {<br/> Task task = tasks.get(position);<br/> holder.taskTextView.setText(task.getTitle());<br/> holder.taskCompletedView.setVisibility(task.isCompleted() ? View.VISIBLE : View.GONE);<br/> }<br/> @Override<br/> public int getItemCount() {<br/> return tasks.size();<br/> }<br/> public void updateTasks(List&lt;Task&gt; newTasks) {<br/> DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new DiffUtil.ItemCallback() {<br/> @Override<br/> public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {<br/> return tasks.get(oldItemPosition).getId() == newTasks.get(newItemPosition).getId();<br/> }<br/> @Override<br/> public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {<br/> Task oldTask = tasks.get(oldItemPosition);<br/> Task newTask = newTasks.get(newItemPosition);<br/> return oldTask.getId() == newTask.getId() &amp;&amp;<br/> oldTask.getTitle().equals(newTask.getTitle()) &amp;&amp;<br/> oldTask.isCompleted() == newTask.isCompleted();<br/> }<br/> });<br/> tasks = newTasks;<br/> diffResult.dispatchUpdatesTo(this);<br/> }<br/>}</span></pre>
  2135. <p id="0d5e"
  2136. class="pw-post-body-paragraph lu lv gf lw b lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr fj bk">
  2137. <strong class="lw gg">Explanation:</strong></p>
  2138. <ul class="">
  2139. <li id="8d71"
  2140. class="lu lv gf lw b lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr nh ni nj bk">
  2141. The <code class="cx nk nl nm my b">TaskAdapter</code> manages a list of <code
  2142. class="cx nk nl nm my b">Task</code> objects.</li>
  2143. <li id="1627"
  2144. class="lu lv gf lw b lx nn lz ma mb no md me mf np mh mi mj nq ml mm mn nr mp mq mr nh ni nj bk">
  2145. The <code class="cx nk nl nm my b">updateTasks</code> method takes a new list of tasks.
  2146. </li>
  2147. <li id="182d"
  2148. class="lu lv gf lw b lx nn lz ma mb no md me mf np mh mi mj nq ml mm mn nr mp mq mr nh ni nj bk">
  2149. We use <code class="cx nk nl nm my b">DiffUtil.calculateDiff</code> to compare the old
  2150. (<code class="cx nk nl nm my b">tasks</code>) and new (<code
  2151. class="cx nk nl nm my b">newTasks</code>) lists based on the provided <code
  2152. class="cx nk nl nm my b">DiffUtil.ItemCallback</code> implementation.</li>
  2153. <li id="f9dc"
  2154. class="lu lv gf lw b lx nn lz ma mb no md me mf np mh mi mj nq ml mm mn nr mp mq mr nh ni nj bk">
  2155. <code class="cx nk nl nm my b">areItemsTheSame</code>: This method checks if two items
  2156. represent the same underlying data object. Here, we compare task IDs to ensure
  2157. we&#x27;re dealing with the same task even if its content changes.</li>
  2158. <li id="2433"
  2159. class="lu lv gf lw b lx nn lz ma mb no md me mf np mh mi mj nq ml mm mn nr mp mq mr nh ni nj bk">
  2160. <code class="cx nk nl nm my b">areContentsTheSame</code>: This method checks if the
  2161. content of two items has changed. We compare the task ID, title, and completion status
  2162. to determine if an update is necessary.</li>
  2163. <li id="f7da"
  2164. class="lu lv gf lw b lx nn lz ma mb no md me mf np mh mi mj nq ml mm mn nr mp mq mr nh ni nj bk">
  2165. The <code class="cx nk nl nm my b">DiffUtil.calculateDiff</code> method returns a <code
  2166. class="cx nk nl nm my b">DiffUtil.DiffResult</code> object containing the minimal set
  2167. of changes required (insertions, deletions, or changes).</li>
  2168. <li id="f995"
  2169. class="lu lv gf lw b lx nn lz ma mb no md me mf np mh mi mj nq ml mm mn nr mp mq mr nh ni nj bk">
  2170. We update the adapter’s internal data list to the new list (<code
  2171. class="cx nk nl nm my b">tasks = newTasks</code>).</li>
  2172. <li id="5714"
  2173. class="lu lv gf lw b lx nn lz ma mb no md me mf np mh mi mj nq ml mm mn nr mp mq mr nh ni nj bk">
  2174. Finally, we call <code
  2175. class="cx nk nl nm my b">diffResult.dispatchUpdatesTo(this)</code> which efficiently
  2176. updates the RecyclerView based on the calculated changes, avoiding unnecessary full view
  2177. refreshes.</li>
  2178. </ul>
  2179. <p id="6a57"
  2180. class="pw-post-body-paragraph lu lv gf lw b lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr fj bk">
  2181. <strong class="lw gg">Benefits:</strong></p>
  2182. <p id="d853"
  2183. class="pw-post-body-paragraph lu lv gf lw b lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr fj bk">
  2184. In this example, DiffUtil helps efficiently update the UI only for tasks that have
  2185. actually changed (completed or not). This improves performance and provides a smoother
  2186. user experience.</p>
  2187. <p id="6ef6"
  2188. class="pw-post-body-paragraph lu lv gf lw b lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr fj bk">
  2189. <strong class="lw gg">Additional Notes:</strong></p>
  2190. <ul class="">
  2191. <li id="de2b"
  2192. class="lu lv gf lw b lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr nh ni nj bk">
  2193. You can customize the comparison logic in <code
  2194. class="cx nk nl nm my b">DiffUtil.ItemCallback</code> based on your data structure and
  2195. needs.</li>
  2196. <li id="90b2"
  2197. class="lu lv gf lw b lx nn lz ma mb no md me mf np mh mi mj nq ml mm mn nr mp mq mr nh ni nj bk">
  2198. This is a basic example. DiffUtil offers additional methods for more complex scenarios
  2199. like handling moved items.</li>
  2200. </ul>
  2201. </div>
  2202. </div>
  2203. </div>
  2204. </div>
  2205. </section>
  2206. </div>
  2207. </div>
  2208. </article>
  2209. </div>
  2210. <div class="ab cb">
  2211. <div class="ci bh ev ew ex ey">
  2212. <div class="ns nt ab ih">
  2213. <div class="nu ab"><a class="nv ay am ao" rel="noopener follow"
  2214. href="/tag/android?source=post_page-----729615b3528c--------------------------------">
  2215. <div class="nw ed cx nx fa ny nz bf b bg z bk oa">Android</div>
  2216. </a></div>
  2217. <div class="nu ab"><a class="nv ay am ao" rel="noopener follow"
  2218. href="/tag/android-app-development?source=post_page-----729615b3528c--------------------------------">
  2219. <div class="nw ed cx nx fa ny nz bf b bg z bk oa">Android App Development</div>
  2220. </a></div>
  2221. <div class="nu ab"><a class="nv ay am ao" rel="noopener follow"
  2222. href="/tag/android-recyclerview?source=post_page-----729615b3528c--------------------------------">
  2223. <div class="nw ed cx nx fa ny nz bf b bg z bk oa">Android Recyclerview</div>
  2224. </a></div>
  2225. <div class="nu ab"><a class="nv ay am ao" rel="noopener follow"
  2226. href="/tag/android-diffutil?source=post_page-----729615b3528c--------------------------------">
  2227. <div class="nw ed cx nx fa ny nz bf b bg z bk oa">Android Diffutil</div>
  2228. </a></div>
  2229. </div>
  2230. </div>
  2231. </div>
  2232. <div class="l"></div>
  2233. <footer class="ob oc od oe of ab q og oh c">
  2234. <div class="l ae">
  2235. <div class="ab cb">
  2236. <div class="ci bh ev ew ex ey">
  2237. <div class="ab cp oi">
  2238. <div class="ab q jq">
  2239. <div class="oj l"><span class="l ok ol om e d">
  2240. <div class="ab q jq jr">
  2241. <div class="pw-multi-vote-icon ed js jt ju jv">
  2242. <div class="">
  2243. <div class="jw jx jy jz ka kb kc am kd ke kf jv"><svg xmlns="http://www.w3.org/2000/svg"
  2244. width="24" height="24" viewBox="0 0 24 24" aria-label="clap">
  2245. <path fill-rule="evenodd"
  2246. d="M11.37.828 12 3.282l.63-2.454zM15.421 1.84l-1.185-.388-.338 2.5zM9.757 1.452l-1.184.389 1.523 2.112zM20.253 11.84 17.75 7.438c-.238-.353-.57-.584-.93-.643a.96.96 0 0 0-.753.183 1.13 1.13 0 0 0-.443.695c.014.019.03.033.044.053l2.352 4.138c1.614 2.95 1.1 5.771-1.525 8.395a7 7 0 0 1-.454.415c.997-.13 1.927-.61 2.773-1.457 2.705-2.704 2.517-5.585 1.438-7.377M12.066 9.01c-.129-.687.08-1.299.573-1.773l-2.062-2.063a1.123 1.123 0 0 0-1.555 0 1.1 1.1 0 0 0-.273.521z"
  2247. clip-rule="evenodd"></path>
  2248. <path fill-rule="evenodd"
  2249. d="M14.741 8.309c-.18-.267-.446-.455-.728-.502a.67.67 0 0 0-.533.127c-.146.113-.59.458-.199 1.296l1.184 2.503a.448.448 0 0 1-.236.755.445.445 0 0 1-.483-.248L7.614 6.106A.816.816 0 1 0 6.459 7.26l3.643 3.644a.446.446 0 1 1-.631.63L5.83 7.896l-1.03-1.03a.82.82 0 0 0-1.395.577.81.81 0 0 0 .24.576l1.027 1.028 3.643 3.643a.444.444 0 0 1-.144.728.44.44 0 0 1-.486-.098l-3.64-3.64a.82.82 0 0 0-1.335.263.81.81 0 0 0 .178.89l1.535 1.534 2.287 2.288a.445.445 0 0 1-.63.63l-2.287-2.288a.813.813 0 0 0-1.393.578c0 .216.086.424.238.577l4.403 4.403c2.79 2.79 5.495 4.119 8.681.931 2.269-2.271 2.708-4.588 1.342-7.086z"
  2250. clip-rule="evenodd"></path>
  2251. </svg></div>
  2252. </div>
  2253. </div>
  2254. <div class="pw-multi-vote-count l kg kh ki kj kk kl km">
  2255. <p class="bf b dy z dx"><span class="jx">--</span></p>
  2256. </div>
  2257. </div>
  2258. </span><span class="l h g f on oo">
  2259. <div class="ab q jq jr">
  2260. <div class="pw-multi-vote-icon ed js jt ju jv">
  2261. <div class="">
  2262. <div class="jw jx jy jz ka kb kc am kd ke kf jv"><svg xmlns="http://www.w3.org/2000/svg"
  2263. width="24" height="24" viewBox="0 0 24 24" aria-label="clap">
  2264. <path fill-rule="evenodd"
  2265. d="M11.37.828 12 3.282l.63-2.454zM15.421 1.84l-1.185-.388-.338 2.5zM9.757 1.452l-1.184.389 1.523 2.112zM20.253 11.84 17.75 7.438c-.238-.353-.57-.584-.93-.643a.96.96 0 0 0-.753.183 1.13 1.13 0 0 0-.443.695c.014.019.03.033.044.053l2.352 4.138c1.614 2.95 1.1 5.771-1.525 8.395a7 7 0 0 1-.454.415c.997-.13 1.927-.61 2.773-1.457 2.705-2.704 2.517-5.585 1.438-7.377M12.066 9.01c-.129-.687.08-1.299.573-1.773l-2.062-2.063a1.123 1.123 0 0 0-1.555 0 1.1 1.1 0 0 0-.273.521z"
  2266. clip-rule="evenodd"></path>
  2267. <path fill-rule="evenodd"
  2268. d="M14.741 8.309c-.18-.267-.446-.455-.728-.502a.67.67 0 0 0-.533.127c-.146.113-.59.458-.199 1.296l1.184 2.503a.448.448 0 0 1-.236.755.445.445 0 0 1-.483-.248L7.614 6.106A.816.816 0 1 0 6.459 7.26l3.643 3.644a.446.446 0 1 1-.631.63L5.83 7.896l-1.03-1.03a.82.82 0 0 0-1.395.577.81.81 0 0 0 .24.576l1.027 1.028 3.643 3.643a.444.444 0 0 1-.144.728.44.44 0 0 1-.486-.098l-3.64-3.64a.82.82 0 0 0-1.335.263.81.81 0 0 0 .178.89l1.535 1.534 2.287 2.288a.445.445 0 0 1-.63.63l-2.287-2.288a.813.813 0 0 0-1.393.578c0 .216.086.424.238.577l4.403 4.403c2.79 2.79 5.495 4.119 8.681.931 2.269-2.271 2.708-4.588 1.342-7.086z"
  2269. clip-rule="evenodd"></path>
  2270. </svg></div>
  2271. </div>
  2272. </div>
  2273. <div class="pw-multi-vote-count l kg kh ki kj kk kl km">
  2274. <p class="bf b dy z dx"><span class="jx">--</span></p>
  2275. </div>
  2276. </div>
  2277. </span></div>
  2278. <div class="bq ab">
  2279. <div>
  2280. <div class="bm" aria-hidden="false"><button class="ao jw kn ko ab q ee kp kq"
  2281. aria-label="responses"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24"
  2282. viewBox="0 0 24 24" class="kr">
  2283. <path
  2284. d="M18.006 16.803c1.533-1.456 2.234-3.325 2.234-5.321C20.24 7.357 16.709 4 12.191 4S4 7.357 4 11.482c0 4.126 3.674 7.482 8.191 7.482.817 0 1.622-.111 2.393-.327.231.2.48.391.744.559 1.06.693 2.203 1.044 3.399 1.044.224-.008.4-.112.486-.287a.49.49 0 0 0-.042-.518c-.495-.67-.845-1.364-1.04-2.057a4 4 0 0 1-.125-.598zm-3.122 1.055-.067-.223-.315.096a8 8 0 0 1-2.311.338c-4.023 0-7.292-2.955-7.292-6.587 0-3.633 3.269-6.588 7.292-6.588 4.014 0 7.112 2.958 7.112 6.593 0 1.794-.608 3.469-2.027 4.72l-.195.168v.255c0 .056 0 .151.016.295.025.231.081.478.154.733.154.558.398 1.117.722 1.659a5.3 5.3 0 0 1-2.165-.845c-.276-.176-.714-.383-.941-.59z">
  2285. </path>
  2286. </svg></button></div>
  2287. </div>
  2288. </div>
  2289. </div>
  2290. <div class="ab q">
  2291. <div class="op l ie">
  2292. <div>
  2293. <div class="bm" aria-hidden="false"><button aria-controls="addToCatalogBookmarkButton"
  2294. aria-expanded="false" aria-label="Add to list bookmark button"
  2295. data-testid="footerBookmarkButton" class="af ee ah ai aj ak al kt an ao ap ib ku kv kw"
  2296. disabled=""><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none"
  2297. viewBox="0 0 24 24" class="av">
  2298. <path fill="#000"
  2299. d="M17.5 1.25a.5.5 0 0 1 1 0v2.5H21a.5.5 0 0 1 0 1h-2.5v2.5a.5.5 0 0 1-1 0v-2.5H15a.5.5 0 0 1 0-1h2.5zm-11 4.5a1 1 0 0 1 1-1H11a.5.5 0 0 0 0-1H7.5a2 2 0 0 0-2 2v14a.5.5 0 0 0 .8.4l5.7-4.4 5.7 4.4a.5.5 0 0 0 .8-.4v-8.5a.5.5 0 0 0-1 0v7.48l-5.2-4a.5.5 0 0 0-.6 0l-5.2 4z">
  2300. </path>
  2301. </svg></button></div>
  2302. </div>
  2303. </div>
  2304. <div class="op l ie">
  2305. <div class="bm" aria-hidden="false" aria-describedby="postFooterSocialMenu"
  2306. aria-labelledby="postFooterSocialMenu">
  2307. <div>
  2308. <div class="bm" aria-hidden="false"><button aria-controls="postFooterSocialMenu"
  2309. aria-expanded="false" aria-label="Share Post" data-testid="footerSocialShareButton"
  2310. class="af ee ah ai aj ak al kt an ao ap ib ld le kq lf"><svg
  2311. xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none"
  2312. viewBox="0 0 24 24">
  2313. <path fill="currentColor" fill-rule="evenodd"
  2314. d="M15.218 4.931a.4.4 0 0 1-.118.132l.012.006a.45.45 0 0 1-.292.074.5.5 0 0 1-.3-.13l-2.02-2.02v7.07c0 .28-.23.5-.5.5s-.5-.22-.5-.5v-7.04l-2 2a.45.45 0 0 1-.57.04h-.02a.4.4 0 0 1-.16-.3.4.4 0 0 1 .1-.32l2.8-2.8a.5.5 0 0 1 .7 0l2.8 2.79a.42.42 0 0 1 .068.498m-.106.138.008.004v-.01zM16 7.063h1.5a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2h-11c-1.1 0-2-.9-2-2v-10a2 2 0 0 1 2-2H8a.5.5 0 0 1 .35.15.5.5 0 0 1 .15.35.5.5 0 0 1-.15.35.5.5 0 0 1-.35.15H6.4c-.5 0-.9.4-.9.9v10.2a.9.9 0 0 0 .9.9h11.2c.5 0 .9-.4.9-.9v-10.2c0-.5-.4-.9-.9-.9H16a.5.5 0 0 1 0-1"
  2315. clip-rule="evenodd"></path>
  2316. </svg></button></div>
  2317. </div>
  2318. </div>
  2319. </div>
  2320. <div class="bm" aria-hidden="false">
  2321. <div>
  2322. <div class="bm" aria-hidden="false"><button aria-label="More options"
  2323. data-testid="footerStoryOptionsButton"
  2324. class="af ee ah ai aj ak al kt an ao ap ib ld le kq lf"><svg
  2325. xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none"
  2326. viewBox="0 0 24 24">
  2327. <path fill="currentColor" fill-rule="evenodd"
  2328. d="M4.385 12c0 .55.2 1.02.59 1.41.39.4.86.59 1.41.59s1.02-.2 1.41-.59c.4-.39.59-.86.59-1.41s-.2-1.02-.59-1.41a1.93 1.93 0 0 0-1.41-.59c-.55 0-1.02.2-1.41.59-.4.39-.59.86-.59 1.41m5.62 0c0 .55.2 1.02.58 1.41.4.4.87.59 1.42.59s1.02-.2 1.41-.59c.4-.39.59-.86.59-1.41s-.2-1.02-.59-1.41a1.93 1.93 0 0 0-1.41-.59c-.55 0-1.03.2-1.42.59s-.58.86-.58 1.41m5.6 0c0 .55.2 1.02.58 1.41.4.4.87.59 1.43.59s1.03-.2 1.42-.59.58-.86.58-1.41-.2-1.02-.58-1.41a1.93 1.93 0 0 0-1.42-.59c-.56 0-1.04.2-1.43.59s-.58.86-.58 1.41"
  2329. clip-rule="evenodd"></path>
  2330. </svg></button></div>
  2331. </div>
  2332. </div>
  2333. </div>
  2334. </div>
  2335. </div>
  2336. </div>
  2337. </div>
  2338. </footer>
  2339. <div class="oq l">
  2340. <div class="ab cb">
  2341. <div class="ci bh ev ew ex ey">
  2342. <div class="ab or os ot ig if">
  2343. <div class="ou ov ow ox oy oz pa pb pc pd ab cp">
  2344. <div class="h k"><a tabindex="0" rel="noopener follow"
  2345. href="/@sandeepkella23?source=post_page---post_author_info--729615b3528c--------------------------------">
  2346. <div class="l ed"><img alt="Sandeep Kella" class="l ep by hn hm cx"
  2347. src="https://miro.medium.com/v2/resize:fill:96:96/1*m4ij-Lr2ZViGgYmypjtQ9A.png" width="48"
  2348. height="48" loading="lazy" />
  2349. <div class="el by l hn hm em n ay pe"></div>
  2350. </div>
  2351. </a></div>
  2352. <div class="j i d"><a tabindex="0" rel="noopener follow"
  2353. href="/@sandeepkella23?source=post_page---post_author_info--729615b3528c--------------------------------">
  2354. <div class="l ed"><img alt="Sandeep Kella" class="l ep by pf pg cx"
  2355. src="https://miro.medium.com/v2/resize:fill:128:128/1*m4ij-Lr2ZViGgYmypjtQ9A.png" width="64"
  2356. height="64" loading="lazy" />
  2357. <div class="el by l pf pg em n ay pe"></div>
  2358. </div>
  2359. </a></div>
  2360. <div class="j i d ph ie">
  2361. <div class="ab"><button
  2362. class="bf b bg z pi nw pj pk pl pm pn po pp pq pr ps pt pu pv pw px ep bm py pz">Follow</button>
  2363. </div>
  2364. </div>
  2365. </div>
  2366. <div class="ab co qa">
  2367. <div class="qb qc qd qe qf l"><a class="af ag ah aj ak al am an ao ap aq ar as at ab q"
  2368. rel="noopener follow"
  2369. href="/@sandeepkella23?source=post_page---post_author_info--729615b3528c--------------------------------">
  2370. <h2 class="pw-author-name bf qh qi qj qk ql qm qn mf qo qp mj qq qr mn qs qt bk"><span
  2371. class="fj qg">Written by <!-- -->Sandeep Kella</span></h2>
  2372. </a>
  2373. <div class="nu ab hl">
  2374. <div class="l ie"><span class="pw-follower-count bf b bg z dx"><a
  2375. class="af ag ah ai aj ak al am an ao ap aq ar hw" rel="noopener follow"
  2376. href="/@sandeepkella23/followers?source=post_page---post_author_info--729615b3528c--------------------------------">2K
  2377. Followers</a></span></div>
  2378. <div class="bf b bg z dx ab qu"><span class="hx l" aria-hidden="true"><span
  2379. class="bf b bg z dx">·</span></span><a class="af ag ah ai aj ak al am an ao ap aq ar hw"
  2380. rel="noopener follow"
  2381. href="/@sandeepkella23/following?source=post_page---post_author_info--729615b3528c--------------------------------">31
  2382. Following</a></div>
  2383. </div>
  2384. <div class="qv l">
  2385. <p class="bf b bg z bk"><span class="fj">Android dev by day, tech writer by night. Breaking down
  2386. code so even my cat could understand it. Join me on Medium for fun, geeky, and practical
  2387. Android tips!</span></p>
  2388. </div>
  2389. </div>
  2390. </div>
  2391. <div class="h k">
  2392. <div class="ab"><button
  2393. class="bf b bg z pi nw pj pk pl pm pn po pp pq pr ps pt pu pv pw px ep bm py pz">Follow</button>
  2394. </div>
  2395. </div>
  2396. </div>
  2397. </div>
  2398. </div>
  2399. </div>
  2400. <div class="qw l">
  2401. <div class="qx bh r oq"></div>
  2402. <div class="ab cb">
  2403. <div class="ci bh ev ew ex ey">
  2404. <div class="ab q cp">
  2405. <h2 class="bf qh qy qz ra rb rc rd re rf rg rh ri rj rk rl rm bk">No responses yet</h2>
  2406. <div class="ab rn">
  2407. <div>
  2408. <div class="bm" aria-hidden="false"><a class="ro rp"
  2409. href="https://policy.medium.com/medium-rules-30e5502c4eb4?source=post_page---post_responses--729615b3528c--------------------------------"
  2410. rel="noopener follow" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="25"
  2411. height="25" viewBox="0 0 25 25">
  2412. <path fill-rule="evenodd"
  2413. d="M11.987 5.036a.754.754 0 0 1 .914-.01c.972.721 1.767 1.218 2.6 1.543.828.322 1.719.485 2.887.505a.755.755 0 0 1 .741.757c-.018 3.623-.43 6.256-1.449 8.21-1.034 1.984-2.662 3.209-4.966 4.083a.75.75 0 0 1-.537-.003c-2.243-.874-3.858-2.095-4.897-4.074-1.024-1.951-1.457-4.583-1.476-8.216a.755.755 0 0 1 .741-.757c1.195-.02 2.1-.182 2.923-.503.827-.322 1.6-.815 2.519-1.535m.468.903c-.897.69-1.717 1.21-2.623 1.564-.898.35-1.856.527-3.026.565.037 3.45.469 5.817 1.36 7.515.884 1.684 2.25 2.762 4.284 3.571 2.092-.81 3.465-1.89 4.344-3.575.886-1.698 1.299-4.065 1.334-7.512-1.149-.039-2.091-.217-2.99-.567-.906-.353-1.745-.873-2.683-1.561m-.009 9.155a2.672 2.672 0 1 0 0-5.344 2.672 2.672 0 0 0 0 5.344m0 1a3.672 3.672 0 1 0 0-7.344 3.672 3.672 0 0 0 0 7.344m-1.813-3.777.525-.526.916.917 1.623-1.625.526.526-2.149 2.152z"
  2414. clip-rule="evenodd"></path>
  2415. </svg></a></div>
  2416. </div>
  2417. </div>
  2418. </div>
  2419. <div class="rq rr rs rt ru l"></div>
  2420. </div>
  2421. </div>
  2422. </div>
  2423. <div class="rv rw rx ry rz l bx">
  2424. <div class="h k j">
  2425. <div class="qx bh sa sb"></div>
  2426. <div class="ab cb">
  2427. <div class="ci bh ev ew ex ey">
  2428. <div class="sc ab jq ih">
  2429. <div class="sd se l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at"
  2430. href="https://help.medium.com/hc/en-us?source=post_page-----729615b3528c--------------------------------"
  2431. rel="noopener follow">
  2432. <p class="bf b dy z dx">Help</p>
  2433. </a></div>
  2434. <div class="sd se l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at"
  2435. href="https://medium.statuspage.io/?source=post_page-----729615b3528c--------------------------------"
  2436. rel="noopener follow">
  2437. <p class="bf b dy z dx">Status</p>
  2438. </a></div>
  2439. <div class="sd se l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" rel="noopener follow"
  2440. href="/about?autoplay=1&amp;source=post_page-----729615b3528c--------------------------------">
  2441. <p class="bf b dy z dx">About</p>
  2442. </a></div>
  2443. <div class="sd se l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" rel="noopener follow"
  2444. href="/jobs-at-medium/work-at-medium-959d1a85284e?source=post_page-----729615b3528c--------------------------------">
  2445. <p class="bf b dy z dx">Careers</p>
  2446. </a></div>
  2447. <div class="sd se l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at"
  2448. href="pressinquiries@medium.com?source=post_page-----729615b3528c--------------------------------"
  2449. rel="noopener follow">
  2450. <p class="bf b dy z dx">Press</p>
  2451. </a></div>
  2452. <div class="sd se l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at"
  2453. href="https://blog.medium.com/?source=post_page-----729615b3528c--------------------------------"
  2454. rel="noopener follow">
  2455. <p class="bf b dy z dx">Blog</p>
  2456. </a></div>
  2457. <div class="sd se l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at"
  2458. href="https://policy.medium.com/medium-privacy-policy-f03bf92035c9?source=post_page-----729615b3528c--------------------------------"
  2459. rel="noopener follow">
  2460. <p class="bf b dy z dx">Privacy</p>
  2461. </a></div>
  2462. <div class="sd se l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at"
  2463. href="https://policy.medium.com/medium-terms-of-service-9db0094a1e0f?source=post_page-----729615b3528c--------------------------------"
  2464. rel="noopener follow">
  2465. <p class="bf b dy z dx">Terms</p>
  2466. </a></div>
  2467. <div class="sd se l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at"
  2468. href="https://speechify.com/medium?source=post_page-----729615b3528c--------------------------------"
  2469. rel="noopener follow">
  2470. <p class="bf b dy z dx">Text to speech</p>
  2471. </a></div>
  2472. <div class="sd l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" rel="noopener follow"
  2473. href="/business?source=post_page-----729615b3528c--------------------------------">
  2474. <p class="bf b dy z dx">Teams</p>
  2475. </a></div>
  2476. </div>
  2477. </div>
  2478. </div>
  2479. </div>
  2480. </div>
  2481. </div>
  2482. </div>
  2483. </div>
  2484. </div>
  2485. <script>window.__BUILD_ID__ = "main-20250122-110459-713feb26b3"</script>
  2486. <script>window.__GRAPHQL_URI__ = "https://medium.com/_/graphql"</script>
  2487. <script>window.__PRELOADED_STATE__ = { "algolia": { "queries": {} }, "cache": { "experimentGroupSet": true, "reason": "User is logged in", "group": "disabled", "tags": ["group-edgeCachePosts", "post-729615b3528c", "user-709acf7c07e3"], "serverVariantState": "", "middlewareEnabled": true, "cacheStatus": "DYNAMIC", "shouldUseCache": false, "vary": [], "lohpSummerUpsellEnabled": false, "pubFeaturingPostPageLabelEnabled": false }, "client": { "hydrated": false, "isUs": false, "isNativeMedium": false, "isSafariMobile": false, "isSafari": false, "isFirefox": false, "routingEntity": { "type": "DEFAULT", "explicit": false }, "viewerIsBot": false }, "debug": { "requestId": "2bf990f9-21a9-41b7-99e5-111501d0348e", "requestTag": "", "hybridDevServices": [], "originalSpanCarrier": { "traceparent": "00-b1c05d7d4732f54db8d24137038d745c-c41bcb6b6079598a-01" } }, "multiVote": { "clapsPerPost": {} }, "navigation": { "branch": { "show": null, "hasRendered": null, "blockedByCTA": false }, "hideGoogleOneTap": false, "hasRenderedAlternateUserBanner": null, "currentLocation": "https:\u002F\u002Fmedium.com\u002F@sandeepkella23\u002Fusing-diffutil-itemcallback-for-efficient-recyclerview-updates-729615b3528c", "host": "medium.com", "hostname": "medium.com", "referrer": "", "hasSetReferrer": false, "susiModal": { "step": null, "operation": "register" }, "postRead": false, "partnerProgram": { "selectedCountryCode": null } }, "config": { "nodeEnv": "production", "version": "main-20250122-110459-713feb26b3", "target": "production", "productName": "Medium", "publicUrl": "https:\u002F\u002Fcdn-client.medium.com\u002Flite", "authDomain": "medium.com", "authGoogleClientId": "216296035834-k1k6qe060s2tp2a2jam4ljdcms00sttg.apps.googleusercontent.com", "favicon": "production", "glyphUrl": "https:\u002F\u002Fglyph.medium.com", "branchKey": "key_live_ofxXr2qTrrU9NqURK8ZwEhknBxiI6KBm", "algolia": { "appId": "MQ57UUUQZ2", "apiKeySearch": "394474ced050e3911ae2249ecc774921", "indexPrefix": "medium_", "host": "-dsn.algolia.net" }, "recaptchaKey": "6Lfc37IUAAAAAKGGtC6rLS13R1Hrw_BqADfS1LRk", "recaptcha3Key": "6Lf8R9wUAAAAABMI_85Wb8melS7Zj6ziuf99Yot5", "recaptchaEnterpriseKeyId": "6Le-uGgpAAAAAPprRaokM8AKthQ9KNGdoxaGUvVp", "datadog": { "applicationId": "6702d87d-a7e0-42fe-bbcb-95b469547ea0", "clientToken": "pub853ea8d17ad6821d9f8f11861d23dfed", "rumToken": "pubf9cc52896502b9413b68ba36fc0c7162", "context": { "deployment": { "target": "production", "tag": "main-20250122-110459-713feb26b3", "commit": "713feb26b3d9571f5ace87eaf9daaf039442f04d" } }, "datacenter": "us" }, "googleAnalyticsCode": "G-7JY7T788PK", "googlePay": { "apiVersion": "2", "apiVersionMinor": "0", "merchantId": "BCR2DN6TV7EMTGBM", "merchantName": "Medium", "instanceMerchantId": "13685562959212738550" }, "applePay": { "version": 3 }, "signInWallCustomDomainCollectionIds": ["3a8144eabfe3", "336d898217ee", "61061eb0c96b", "138adf9c44c", "819cc2aaeee0"], "mediumMastodonDomainName": "me.dm", "mediumOwnedAndOperatedCollectionIds": ["8a9336e5bb4", "b7e45b22fec3", "193b68bd4fba", "8d6b8a439e32", "54c98c43354d", "3f6ecf56618", "d944778ce714", "92d2092dc598", "ae2a65f35510", "1285ba81cada", "544c7006046e", "fc8964313712", "40187e704f1c", "88d9857e584e", "7b6769f2748b", "bcc38c8f6edf", "cef6983b292", "cb8577c9149e", "444d13b52878", "713d7dbc99b0", "ef8e90590e66", "191186aaafa0", "55760f21cdc5", "9dc80918cc93", "bdc4052bbdba", "8ccfed20cbb2"], "tierOneDomains": ["medium.com", "thebolditalic.com", "arcdigital.media", "towardsdatascience.com", "uxdesign.cc", "codeburst.io", "psiloveyou.xyz", "writingcooperative.com", "entrepreneurshandbook.co", "prototypr.io", "betterhumans.coach.me", "theascent.pub"], "topicsToFollow": ["d61cf867d93f", "8a146bc21b28", "1eca0103fff3", "4d562ee63426", "aef1078a3ef5", "e15e46793f8d", "6158eb913466", "55f1c20aba7a", "3d18b94f6858", "4861fee224fd", "63c6f1f93ee", "1d98b3a9a871", "decb52b64abf", "ae5d4995e225", "830cded25262"], "topicToTagMappings": { "accessibility": "accessibility", "addiction": "addiction", "android-development": "android-development", "art": "art", "artificial-intelligence": "artificial-intelligence", "astrology": "astrology", "basic-income": "basic-income", "beauty": "beauty", "biotech": "biotech", "blockchain": "blockchain", "books": "books", "business": "business", "cannabis": "cannabis", "cities": "cities", "climate-change": "climate-change", "comics": "comics", "coronavirus": "coronavirus", "creativity": "creativity", "cryptocurrency": "cryptocurrency", "culture": "culture", "cybersecurity": "cybersecurity", "data-science": "data-science", "design": "design", "digital-life": "digital-life", "disability": "disability", "economy": "economy", "education": "education", "equality": "equality", "family": "family", "feminism": "feminism", "fiction": "fiction", "film": "film", "fitness": "fitness", "food": "food", "freelancing": "freelancing", "future": "future", "gadgets": "gadgets", "gaming": "gaming", "gun-control": "gun-control", "health": "health", "history": "history", "humor": "humor", "immigration": "immigration", "ios-development": "ios-development", "javascript": "javascript", "justice": "justice", "language": "language", "leadership": "leadership", "lgbtqia": "lgbtqia", "lifestyle": "lifestyle", "machine-learning": "machine-learning", "makers": "makers", "marketing": "marketing", "math": "math", "media": "media", "mental-health": "mental-health", "mindfulness": "mindfulness", "money": "money", "music": "music", "neuroscience": "neuroscience", "nonfiction": "nonfiction", "outdoors": "outdoors", "parenting": "parenting", "pets": "pets", "philosophy": "philosophy", "photography": "photography", "podcasts": "podcast", "poetry": "poetry", "politics": "politics", "privacy": "privacy", "product-management": "product-management", "productivity": "productivity", "programming": "programming", "psychedelics": "psychedelics", "psychology": "psychology", "race": "race", "relationships": "relationships", "religion": "religion", "remote-work": "remote-work", "san-francisco": "san-francisco", "science": "science", "self": "self", "self-driving-cars": "self-driving-cars", "sexuality": "sexuality", "social-media": "social-media", "society": "society", "software-engineering": "software-engineering", "space": "space", "spirituality": "spirituality", "sports": "sports", "startups": "startup", "style": "style", "technology": "technology", "transportation": "transportation", "travel": "travel", "true-crime": "true-crime", "tv": "tv", "ux": "ux", "venture-capital": "venture-capital", "visual-design": "visual-design", "work": "work", "world": "world", "writing": "writing" }, "defaultImages": { "avatar": { "imageId": "1*dmbNkD5D-u45r44go_cf0g.png", "height": 150, "width": 150 }, "orgLogo": { "imageId": "7*V1_7XP4snlmqrc_0Njontw.png", "height": 110, "width": 500 }, "postLogo": { "imageId": "bd978bb536350a710e8efb012513429cabdc4c28700604261aeda246d0f980b7", "height": 810, "width": 1440 }, "postPreviewImage": { "imageId": "1*hn4v1tCaJy7cWMyb0bpNpQ.png", "height": 386, "width": 579 } }, "collectionStructuredData": { "8d6b8a439e32": { "name": "Elemental", "data": { "@type": "NewsMediaOrganization", "ethicsPolicy": "https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473", "logo": { "@type": "ImageObject", "url": "https:\u002F\u002Fcdn-images-1.medium.com\u002Fmax\u002F980\u002F1*9ygdqoKprhwuTVKUM0DLPA@2x.png", "width": 980, "height": 159 } } }, "3f6ecf56618": { "name": "Forge", "data": { "@type": "NewsMediaOrganization", "ethicsPolicy": "https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473", "logo": { "@type": "ImageObject", "url": "https:\u002F\u002Fcdn-images-1.medium.com\u002Fmax\u002F596\u002F1*uULpIlImcO5TDuBZ6lm7Lg@2x.png", "width": 596, "height": 183 } } }, "ae2a65f35510": { "name": "GEN", "data": { "@type": "NewsMediaOrganization", "ethicsPolicy": "https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473", "logo": { "@type": "ImageObject", "url": "https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F264\u002F1*RdVZMdvfV3YiZTw6mX7yWA.png", "width": 264, "height": 140 } } }, "88d9857e584e": { "name": "LEVEL", "data": { "@type": "NewsMediaOrganization", "ethicsPolicy": "https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473", "logo": { "@type": "ImageObject", "url": "https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F540\u002F1*JqYMhNX6KNNb2UlqGqO2WQ.png", "width": 540, "height": 108 } } }, "7b6769f2748b": { "name": "Marker", "data": { "@type": "NewsMediaOrganization", "ethicsPolicy": "https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473", "logo": { "@type": "ImageObject", "url": "https:\u002F\u002Fcdn-images-1.medium.com\u002Fmax\u002F383\u002F1*haCUs0wF6TgOOvfoY-jEoQ@2x.png", "width": 383, "height": 92 } } }, "444d13b52878": { "name": "OneZero", "data": { "@type": "NewsMediaOrganization", "ethicsPolicy": "https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473", "logo": { "@type": "ImageObject", "url": "https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F540\u002F1*cw32fIqCbRWzwJaoQw6BUg.png", "width": 540, "height": 123 } } }, "8ccfed20cbb2": { "name": "Zora", "data": { "@type": "NewsMediaOrganization", "ethicsPolicy": "https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473", "logo": { "@type": "ImageObject", "url": "https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F540\u002F1*tZUQqRcCCZDXjjiZ4bDvgQ.png", "width": 540, "height": 106 } } } }, "embeddedPostIds": { "coronavirus": "cd3010f9d81f" }, "sharedCdcMessaging": { "COVID_APPLICABLE_TAG_SLUGS": [], "COVID_APPLICABLE_TOPIC_NAMES": [], "COVID_APPLICABLE_TOPIC_NAMES_FOR_TOPIC_PAGE": [], "COVID_MESSAGES": { "tierA": { "text": "For more information on the novel coronavirus and Covid-19, visit cdc.gov.", "markups": [{ "start": 66, "end": 73, "href": "https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV" }] }, "tierB": { "text": "Anyone can publish on Medium per our Policies, but we don’t fact-check every story. For more info about the coronavirus, see cdc.gov.", "markups": [{ "start": 37, "end": 45, "href": "https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Fcategories\u002F201931128-Policies-Safety" }, { "start": 125, "end": 132, "href": "https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV" }] }, "paywall": { "text": "This article has been made free for everyone, thanks to Medium Members. For more information on the novel coronavirus and Covid-19, visit cdc.gov.", "markups": [{ "start": 56, "end": 70, "href": "https:\u002F\u002Fmedium.com\u002Fmembership" }, { "start": 138, "end": 145, "href": "https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV" }] }, "unbound": { "text": "This article is free for everyone, thanks to Medium Members. For more information on the novel coronavirus and Covid-19, visit cdc.gov.", "markups": [{ "start": 45, "end": 59, "href": "https:\u002F\u002Fmedium.com\u002Fmembership" }, { "start": 127, "end": 134, "href": "https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV" }] } }, "COVID_BANNER_POST_ID_OVERRIDE_WHITELIST": ["3b31a67bff4a"] }, "sharedVoteMessaging": { "TAGS": ["politics", "election-2020", "government", "us-politics", "election", "2020-presidential-race", "trump", "donald-trump", "democrats", "republicans", "congress", "republican-party", "democratic-party", "biden", "joe-biden", "maga"], "TOPICS": ["politics", "election"], "MESSAGE": { "text": "Find out more about the U.S. election results here.", "markups": [{ "start": 46, "end": 50, "href": "https:\u002F\u002Fcookpolitical.com\u002F2020-national-popular-vote-tracker" }] }, "EXCLUDE_POSTS": ["397ef29e3ca5"] }, "embedPostRules": [], "recircOptions": { "v1": { "limit": 3 }, "v2": { "limit": 8 } }, "braintreeClientKey": "production_zjkj96jm_m56f8fqpf7ngnrd4", "braintree": { "enabled": true, "merchantId": "m56f8fqpf7ngnrd4", "merchantAccountId": { "usd": "AMediumCorporation_instant", "eur": "amediumcorporation_EUR", "cad": "amediumcorporation_CAD" }, "publicKey": "ds2nn34bg2z7j5gd", "braintreeEnvironment": "production", "dashboardUrl": "https:\u002F\u002Fwww.braintreegateway.com\u002Fmerchants", "gracePeriodDurationInDays": 14, "mediumMembershipPlanId": { "monthly": "ce105f8c57a3", "monthlyV2": "e8a5e126-792b-4ee6-8fba-d574c1b02fc5", "monthlyWithTrial": "d5ee3dbe3db8", "monthlyPremium": "fa741a9b47a2", "yearly": "a40ad4a43185", "yearlyV2": "3815d7d6-b8ca-4224-9b8c-182f9047866e", "yearlyStaff": "d74fb811198a", "yearlyWithTrial": "b3bc7350e5c7", "yearlyPremium": "e21bd2c12166", "monthlyOneYearFree": "e6c0637a-2bad-4171-ab4f-3c268633d83c", "monthly25PercentOffFirstYear": "235ecc62-0cdb-49ae-9378-726cd21c504b", "monthly20PercentOffFirstYear": "ba518864-9c13-4a99-91ca-411bf0cac756", "monthly15PercentOffFirstYear": "594c029b-9f89-43d5-88f8-8173af4e070e", "monthly10PercentOffFirstYear": "c6c7bc9a-40f2-4b51-8126-e28511d5bdb0", "monthlyForStudents": "629ebe51-da7d-41fd-8293-34cd2f2030a8", "yearlyOneYearFree": "78ba7be9-0d9f-4ece-aa3e-b54b826f2bf1", "yearly25PercentOffFirstYear": "2dbb010d-bb8f-4eeb-ad5c-a08509f42d34", "yearly20PercentOffFirstYear": "47565488-435b-47f8-bf93-40d5fbe0ebc8", "yearly15PercentOffFirstYear": "8259809b-0881-47d9-acf7-6c001c7f720f", "yearly10PercentOffFirstYear": "9dd694fb-96e1-472c-8d9e-3c868d5c1506", "yearlyForStudents": "e29345ef-ab1c-4234-95c5-70e50fe6bc23", "monthlyCad": "p52orjkaceei", "yearlyCad": "h4q9g2up9ktt" }, "braintreeDiscountId": { "oneMonthFree": "MONTHS_FREE_01", "threeMonthsFree": "MONTHS_FREE_03", "sixMonthsFree": "MONTHS_FREE_06", "fiftyPercentOffOneYear": "FIFTY_PERCENT_OFF_ONE_YEAR" }, "3DSecureVersion": "2", "defaultCurrency": "usd", "providerPlanIdCurrency": { "4ycw": "usd", "rz3b": "usd", "3kqm": "usd", "jzw6": "usd", "c2q2": "usd", "nnsw": "usd", "q8qw": "usd", "d9y6": "usd", "fx7w": "cad", "nwf2": "cad" } }, "paypalClientId": "AXj1G4fotC2GE8KzWX9mSxCH1wmPE3nJglf4Z2ig_amnhvlMVX87otaq58niAg9iuLktVNF_1WCMnN7v", "paypal": { "host": "https:\u002F\u002Fapi.paypal.com:443", "clientMode": "production", "serverMode": "live", "webhookId": "4G466076A0294510S", "monthlyPlan": { "planId": "P-9WR0658853113943TMU5FDQA", "name": "Medium Membership (Monthly) with setup fee", "description": "Unlimited access to the best and brightest stories on Medium. Membership billed monthly." }, "yearlyPlan": { "planId": "P-7N8963881P8875835MU5JOPQ", "name": "Medium Membership (Annual) with setup fee", "description": "Unlimited access to the best and brightest stories on Medium. Membership billed annually." }, "oneYearGift": { "name": "Medium Membership (1 Year, Digital Gift Code)", "description": "Unlimited access to the best and brightest stories on Medium. Gift codes can be redeemed at medium.com\u002Fredeem.", "price": "50.00", "currency": "USD", "sku": "membership-gift-1-yr" }, "oldMonthlyPlan": { "planId": "P-96U02458LM656772MJZUVH2Y", "name": "Medium Membership (Monthly)", "description": "Unlimited access to the best and brightest stories on Medium. Membership billed monthly." }, "oldYearlyPlan": { "planId": "P-59P80963JF186412JJZU3SMI", "name": "Medium Membership (Annual)", "description": "Unlimited access to the best and brightest stories on Medium. Membership billed annually." }, "monthlyPlanWithTrial": { "planId": "P-66C21969LR178604GJPVKUKY", "name": "Medium Membership (Monthly) with setup fee", "description": "Unlimited access to the best and brightest stories on Medium. Membership billed monthly." }, "yearlyPlanWithTrial": { "planId": "P-6XW32684EX226940VKCT2MFA", "name": "Medium Membership (Annual) with setup fee", "description": "Unlimited access to the best and brightest stories on Medium. Membership billed annually." }, "oldMonthlyPlanNoSetupFee": { "planId": "P-4N046520HR188054PCJC7LJI", "name": "Medium Membership (Monthly)", "description": "Unlimited access to the best and brightest stories on Medium. Membership billed monthly." }, "oldYearlyPlanNoSetupFee": { "planId": "P-7A4913502Y5181304CJEJMXQ", "name": "Medium Membership (Annual)", "description": "Unlimited access to the best and brightest stories on Medium. Membership billed annually." }, "sdkUrl": "https:\u002F\u002Fwww.paypal.com\u002Fsdk\u002Fjs" }, "stripePublishableKey": "pk_live_7FReX44VnNIInZwrIIx6ghjl", "log": { "json": true, "level": "info" }, "imageUploadMaxSizeMb": 25, "staffPicks": { "title": "Staff Picks", "catalogId": "c7bc6e1ee00f" } }, "session": { "xsrf": "07cd857f2920" } }</script>
  2488. <script>window.__APOLLO_STATE__ = { "ROOT_QUERY": { "__typename": "Query", "variantFlags": [{ "__typename": "VariantFlag", "name": "enable_author_cards", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_lite_response_markup", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "ios_enable_friend_links_creation", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_ios_dynamic_paywall_aspiriational", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_pill_based_home_feed", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_lo_homepage", "valueType": { "__typename": "VariantFlagString", "value": "control" } }, { "__typename": "VariantFlag", "name": "enable_sprig", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "price_smoke_test_monthly", "valueType": { "__typename": "VariantFlagString", "value": "" } }, { "__typename": "VariantFlag", "name": "enable_google_one_tap", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_tick_landing_page", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "rex_generator_max_candidates", "valueType": { "__typename": "VariantFlagNumber", "value": 1000 } }, { "__typename": "VariantFlag", "name": "allow_access", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_hybrid_ranking_model", "valueType": { "__typename": "VariantFlagString", "value": "experiment" } }, { "__typename": "VariantFlag", "name": "enable_premium_tier", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "android_two_hour_refresh", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "browsable_stream_config_bucket", "valueType": { "__typename": "VariantFlagString", "value": "curated-topics" } }, { "__typename": "VariantFlag", "name": "disable_partner_program_enrollment", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_google_webhook", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_rex_new_push_notification_endpoint", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "android_enable_image_sharer", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_import", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_marketing_emails", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "ios_remove_twitter_onboarding_step", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_tag_recs", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "price_smoke_test_yearly", "valueType": { "__typename": "VariantFlagString", "value": "" } }, { "__typename": "VariantFlag", "name": "android_enable_topic_portals", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_rex_reading_history", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "limit_user_follows", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_braintree_integration", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_rex_aggregator_v2", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "ios_enable_home_post_menu", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "android_enable_lists_v2", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_post_publish_permission_check", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_switch_plan_premium_tier", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_tribute_landing_page", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "num_post_bottom_responses_to_show", "valueType": { "__typename": "VariantFlagString", "value": "3" } }, { "__typename": "VariantFlag", "name": "enable_abandoned_paywall_promotion_email", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "allow_signup", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_bg_post_post", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_mastodon_avatar_upload", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_pub_featuring_stats", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_see_pronouns", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "reader_fair_distribution_non_qp", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_abandoned_cart_promotion_email", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_winback_promotion_email", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "goliath_externalsearch_enable_comment_deindexation", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "signin_services", "valueType": { "__typename": "VariantFlagString", "value": "twitter,facebook,google,email,google-fastidv,google-one-tap,apple" } }, { "__typename": "VariantFlag", "name": "enable_intrinsic_automatic_actions", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_ranker_v10", "valueType": { "__typename": "VariantFlagString", "value": "control" } }, { "__typename": "VariantFlag", "name": "android_rating_prompt_stories_read_threshold", "valueType": { "__typename": "VariantFlagNumber", "value": 2 } }, { "__typename": "VariantFlag", "name": "enable_deprecate_legacy_providers_v3", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_braintree_apple_pay", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_braintree_client", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_plans_page_payment_form", "valueType": { "__typename": "VariantFlagString", "value": "control" } }, { "__typename": "VariantFlag", "name": "enable_sharer_validate_post_share_key", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_android_offline_reading", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_diversification_rex", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "mobile_custom_app_icon", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "available_monthly_premium_plan", "valueType": { "__typename": "VariantFlagString", "value": "12a660186432" } }, { "__typename": "VariantFlag", "name": "enable_deviant_get_variant_flag_from_medium2", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_post_bottom_responses", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "glyph_font_set", "valueType": { "__typename": "VariantFlagString", "value": "m2-unbound-source-serif-pro" } }, { "__typename": "VariantFlag", "name": "enable_android_dynamic_aspirational_paywall", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_pp_country_expansion", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_android_miro_v2", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_ios_easy_resubscribe", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_lite_server_upstream_deadlines", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_moc_load_processor_c", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_sms_verification_for_publish", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_verifications_service", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_members_only_audio", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "available_monthly_plan", "valueType": { "__typename": "VariantFlagString", "value": "60e220181034" } }, { "__typename": "VariantFlag", "name": "can_receive_tips_v0", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_premium_tier_badge", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "ios_enable_friend_links_postpage_banners", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "coronavirus_topic_recirc", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_ml_rank_rex_anno", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_sharer_create_post_share_key", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "ios_iceland_nux", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "android_enable_friend_links_postpage_banners", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_cancellation_discount_v1_gate", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_lite_archive_page", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_medium2_kbfd", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_new_manage_membership_flow", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_android_verified_author", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_auto_follow_on_subscribe", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_creator_welcome_email", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_entities_to_follow_v2", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_publication_hierarchy_web", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_recaptcha_enterprise", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "ios_display_paywall_after_onboarding", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "skip_fs_cache_user_vals", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_author_cards_byline", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_recirc_model", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_apple_sign_in", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_footer_app_buttons", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_moc_load_processor_first_story", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_seamless_social_sharing", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_moc_load_processor_all_recs_surfaces", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_starspace", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "ios_enable_lock_responses", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_braintree_trial_membership", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_group_gifting", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_update_explore_wtf", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "android_enable_syntax_highlight", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_recommended_publishers_query", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_rito_upstream_deadlines", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_post_bottom_responses_input", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_post_bottom_responses_native", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_tipping_v0_android", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "android_enable_friend_links_creation", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_braintree_webhook", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_pub_featuring", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "redefined_top_posts", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_app_flirty_thirty", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_updated_pub_recs_ui", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_ios_offline_reading", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "android_enable_editor_new_publishing_flow", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_boost_nia_v01", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_pp_v4", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "ios_in_app_free_trial", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_aurora_pub_follower_page", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_automod", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_braintree_google_pay", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_iceland_forced_android", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_ios_autorefresh", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_lite_homepage", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_new_stripe_customers", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "textshots_userid", "valueType": { "__typename": "VariantFlagString", "value": "" } }, { "__typename": "VariantFlag", "name": "allow_test_auth", "valueType": { "__typename": "VariantFlagString", "value": "disallow" } }, { "__typename": "VariantFlag", "name": "available_annual_plan", "valueType": { "__typename": "VariantFlagString", "value": "2c754bcc2995" } }, { "__typename": "VariantFlag", "name": "enable_pre_pp_v4", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "ios_enable_verified_book_author", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_conversion_model_v2", "valueType": { "__typename": "VariantFlagString", "value": "group_2" } }, { "__typename": "VariantFlag", "name": "enable_trust_service_recaptcha", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_branch_io", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_speechify_widget", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_eventstats_event_processing", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_simplified_digest_v2_b", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_susi_redesign_ios", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "signup_services", "valueType": { "__typename": "VariantFlagString", "value": "twitter,facebook,google,email,google-fastidv,google-one-tap,apple" } }, { "__typename": "VariantFlag", "name": "enable_apple_webhook", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_tipping_v0_ios", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_update_topic_portals_wtf", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_cache_less_following_feed", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_ios_dynamic_paywall_programming", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_mastodon_for_members", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "limit_post_referrers", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "onboarding_tags_from_top_views", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_android_dynamic_programming_paywall", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_conversion_ranker_v2", "valueType": { "__typename": "VariantFlagString", "value": "control" } }, { "__typename": "VariantFlag", "name": "enable_speechify_ios", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_susi_redesign_android", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_braintree_paypal", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_mastodon_for_members_username_selection", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "reengagement_notification_duration", "valueType": { "__typename": "VariantFlagNumber", "value": 3 } }, { "__typename": "VariantFlag", "name": "available_annual_premium_plan", "valueType": { "__typename": "VariantFlagString", "value": "4a442ace1476" } }, { "__typename": "VariantFlag", "name": "enable_configure_pronouns", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_legacy_feed_in_iceland", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_newsletter_lo_flow_custom_domains", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "ios_social_share_sheet", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "can_send_tips_v0", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_lite_continue_this_thread", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_maim_the_meter", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }], "viewer": { "__ref": "User:4954827388ef" }, "collectionByDomainOrSlug({\"domainOrSlug\":\"medium.com\"})": null, "postResult({\"id\":\"729615b3528c\"})": { "__ref": "Post:729615b3528c" } }, "UserViewerEdge:userId:4954827388ef-viewerId:4954827388ef": { "__typename": "UserViewerEdge", "id": "userId:4954827388ef-viewerId:4954827388ef", "createdAt": 1691393307564 }, "User:4954827388ef": { "__typename": "User", "id": "4954827388ef", "allowEmailAddressSharingEditorWriter": false, "dismissableFlags": [], "emailObfuscated": "gu••••••••••@163.com", "geolocation": { "__typename": "Geolocation", "country": "US" }, "hasGroupGiftingEnabled": false, "hasPastMemberships": false, "hasSubdomain": false, "imageId": "0*tPpe_E0eT2MCh2h2", "isEligibleToImportEmails": false, "isEligibleToViewNewResponses": true, "isMembershipTrialEligible": true, "isSuspended": false, "membership": null, "name": "Guoziyun", "partnerProgramEnrollment": null, "postSubscribeMembershipUpsellShownAt": 0, "styleEditorOnboardingVersionSeen": 0, "twitterScreenName": "", "unverifiedEmail": "", "username": "guoziyun1999", "viewerEdge": { "__ref": "UserViewerEdge:userId:4954827388ef-viewerId:4954827388ef" }, "pronouns": [] }, "LinkedAccounts:709acf7c07e3": { "__typename": "LinkedAccounts", "mastodon": null, "id": "709acf7c07e3" }, "Membership:18aa4934-76db-44ba-9003-0eace9da7ae1": { "__typename": "Membership", "tier": "MEMBER", "id": "18aa4934-76db-44ba-9003-0eace9da7ae1" }, "User:709acf7c07e3": { "__typename": "User", "id": "709acf7c07e3", "linkedAccounts": { "__ref": "LinkedAccounts:709acf7c07e3" }, "isSuspended": false, "name": "Sandeep Kella", "imageId": "1*m4ij-Lr2ZViGgYmypjtQ9A.png", "customDomainState": null, "hasSubdomain": false, "username": "sandeepkella23", "verifications": { "__typename": "VerifiedInfo", "isBookAuthor": false }, "socialStats": { "__typename": "SocialStats", "followerCount": 2098, "followingCount": 17, "collectionFollowingCount": 14 }, "bio": "Android dev by day, tech writer by night. Breaking down code so even my cat could understand it. Join me on Medium for fun, geeky, and practical Android tips!", "membership": { "__ref": "Membership:18aa4934-76db-44ba-9003-0eace9da7ae1" }, "allowNotes": true, "viewerEdge": { "__ref": "UserViewerEdge:userId:709acf7c07e3-viewerId:4954827388ef" }, "twitterScreenName": "" }, "ImageMetadata:1*9-tDBevuDRdN2pMUN5GJhg.png": { "__typename": "ImageMetadata", "id": "1*9-tDBevuDRdN2pMUN5GJhg.png", "originalHeight": 565, "originalWidth": 1078, "focusPercentX": null, "focusPercentY": null, "alt": null }, "Paragraph:6ecbd3f52f06_0": { "__typename": "Paragraph", "id": "6ecbd3f52f06_0", "name": "521b", "type": "IMG", "href": null, "layout": "INSET_CENTER", "metadata": { "__ref": "ImageMetadata:1*9-tDBevuDRdN2pMUN5GJhg.png" }, "text": "", "hasDropCap": null, "dropCapImage": null, "markups": [], "codeBlockMetadata": null, "iframe": null, "mixtapeMetadata": null }, "Paragraph:6ecbd3f52f06_1": { "__typename": "Paragraph", "id": "6ecbd3f52f06_1", "name": "d09a", "type": "H3", "href": null, "layout": null, "metadata": null, "text": "Using DiffUtil.ItemCallback for Efficient RecyclerView Updates", "hasDropCap": null, "dropCapImage": null, "markups": [], "codeBlockMetadata": null, "iframe": null, "mixtapeMetadata": null }, "Paragraph:6ecbd3f52f06_2": { "__typename": "Paragraph", "id": "6ecbd3f52f06_2", "name": "384c", "type": "P", "href": null, "layout": null, "metadata": null, "text": "Here’s an explanation of DiffUtil.ItemCallback with a sample use case and code:", "hasDropCap": null, "dropCapImage": null, "markups": [], "codeBlockMetadata": null, "iframe": null, "mixtapeMetadata": null }, "Paragraph:6ecbd3f52f06_3": { "__typename": "Paragraph", "id": "6ecbd3f52f06_3", "name": "6332", "type": "P", "href": null, "layout": null, "metadata": null, "text": "Use Case: Imagine you have a RecyclerView displaying a list of tasks. When a user marks a task as complete, you want to update the UI to reflect the change (e.g., strikethrough for completed tasks).", "hasDropCap": null, "dropCapImage": null, "markups": [{ "__typename": "Markup", "type": "STRONG", "start": 0, "end": 9, "href": null, "anchorType": null, "userId": null, "linkMetadata": null }], "codeBlockMetadata": null, "iframe": null, "mixtapeMetadata": null }, "Paragraph:6ecbd3f52f06_4": { "__typename": "Paragraph", "id": "6ecbd3f52f06_4", "name": "dd75", "type": "P", "href": null, "layout": null, "metadata": null, "text": "DiffUtil.ItemCallback Implementation:", "hasDropCap": null, "dropCapImage": null, "markups": [{ "__typename": "Markup", "type": "STRONG", "start": 0, "end": 37, "href": null, "anchorType": null, "userId": null, "linkMetadata": null }], "codeBlockMetadata": null, "iframe": null, "mixtapeMetadata": null }, "Paragraph:6ecbd3f52f06_5": { "__typename": "Paragraph", "id": "6ecbd3f52f06_5", "name": "f5c1", "type": "PRE", "href": null, "layout": null, "metadata": null, "text": "public class TaskAdapter extends RecyclerView.Adapter\u003CTaskViewHolder\u003E {\nprivate List\u003CTask\u003E tasks;\n public TaskAdapter(List\u003CTask\u003E tasks) {\n this.tasks = tasks;\n }\n @Override\n public TaskViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {\n \u002F\u002F ... (inflate view layout for the task)\n return new TaskViewHolder(itemView);\n }\n @Override\n public void onBindViewHolder(TaskViewHolder holder, int position) {\n Task task = tasks.get(position);\n holder.taskTextView.setText(task.getTitle());\n holder.taskCompletedView.setVisibility(task.isCompleted() ? View.VISIBLE : View.GONE);\n }\n @Override\n public int getItemCount() {\n return tasks.size();\n }\n public void updateTasks(List\u003CTask\u003E newTasks) {\n DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new DiffUtil.ItemCallback() {\n @Override\n public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {\n return tasks.get(oldItemPosition).getId() == newTasks.get(newItemPosition).getId();\n }\n @Override\n public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {\n Task oldTask = tasks.get(oldItemPosition);\n Task newTask = newTasks.get(newItemPosition);\n return oldTask.getId() == newTask.getId() &&\n oldTask.getTitle().equals(newTask.getTitle()) &&\n oldTask.isCompleted() == newTask.isCompleted();\n }\n });\n tasks = newTasks;\n diffResult.dispatchUpdatesTo(this);\n }\n}", "hasDropCap": null, "dropCapImage": null, "markups": [], "codeBlockMetadata": { "__typename": "CodeBlockMetadata", "mode": "AUTO", "lang": "java" }, "iframe": null, "mixtapeMetadata": null }, "Paragraph:6ecbd3f52f06_6": { "__typename": "Paragraph", "id": "6ecbd3f52f06_6", "name": "0d5e", "type": "P", "href": null, "layout": null, "metadata": null, "text": "Explanation:", "hasDropCap": null, "dropCapImage": null, "markups": [{ "__typename": "Markup", "type": "STRONG", "start": 0, "end": 12, "href": null, "anchorType": null, "userId": null, "linkMetadata": null }], "codeBlockMetadata": null, "iframe": null, "mixtapeMetadata": null }, "Paragraph:6ecbd3f52f06_7": { "__typename": "Paragraph", "id": "6ecbd3f52f06_7", "name": "8d71", "type": "ULI", "href": null, "layout": null, "metadata": null, "text": "The TaskAdapter manages a list of Task objects.", "hasDropCap": null, "dropCapImage": null, "markups": [{ "__typename": "Markup", "type": "CODE", "start": 4, "end": 15, "href": null, "anchorType": null, "userId": null, "linkMetadata": null }, { "__typename": "Markup", "type": "CODE", "start": 34, "end": 38, "href": null, "anchorType": null, "userId": null, "linkMetadata": null }], "codeBlockMetadata": null, "iframe": null, "mixtapeMetadata": null }, "Paragraph:6ecbd3f52f06_8": { "__typename": "Paragraph", "id": "6ecbd3f52f06_8", "name": "1627", "type": "ULI", "href": null, "layout": null, "metadata": null, "text": "The updateTasks method takes a new list of tasks.", "hasDropCap": null, "dropCapImage": null, "markups": [{ "__typename": "Markup", "type": "CODE", "start": 4, "end": 15, "href": null, "anchorType": null, "userId": null, "linkMetadata": null }], "codeBlockMetadata": null, "iframe": null, "mixtapeMetadata": null }, "Paragraph:6ecbd3f52f06_9": { "__typename": "Paragraph", "id": "6ecbd3f52f06_9", "name": "182d", "type": "ULI", "href": null, "layout": null, "metadata": null, "text": "We use DiffUtil.calculateDiff to compare the old (tasks) and new (newTasks) lists based on the provided DiffUtil.ItemCallback implementation.", "hasDropCap": null, "dropCapImage": null, "markups": [{ "__typename": "Markup", "type": "CODE", "start": 7, "end": 29, "href": null, "anchorType": null, "userId": null, "linkMetadata": null }, { "__typename": "Markup", "type": "CODE", "start": 50, "end": 55, "href": null, "anchorType": null, "userId": null, "linkMetadata": null }, { "__typename": "Markup", "type": "CODE", "start": 66, "end": 74, "href": null, "anchorType": null, "userId": null, "linkMetadata": null }, { "__typename": "Markup", "type": "CODE", "start": 104, "end": 125, "href": null, "anchorType": null, "userId": null, "linkMetadata": null }], "codeBlockMetadata": null, "iframe": null, "mixtapeMetadata": null }, "Paragraph:6ecbd3f52f06_10": { "__typename": "Paragraph", "id": "6ecbd3f52f06_10", "name": "f9dc", "type": "ULI", "href": null, "layout": null, "metadata": null, "text": "areItemsTheSame: This method checks if two items represent the same underlying data object. Here, we compare task IDs to ensure we're dealing with the same task even if its content changes.", "hasDropCap": null, "dropCapImage": null, "markups": [{ "__typename": "Markup", "type": "CODE", "start": 0, "end": 15, "href": null, "anchorType": null, "userId": null, "linkMetadata": null }], "codeBlockMetadata": null, "iframe": null, "mixtapeMetadata": null }, "Paragraph:6ecbd3f52f06_11": { "__typename": "Paragraph", "id": "6ecbd3f52f06_11", "name": "2433", "type": "ULI", "href": null, "layout": null, "metadata": null, "text": "areContentsTheSame: This method checks if the content of two items has changed. We compare the task ID, title, and completion status to determine if an update is necessary.", "hasDropCap": null, "dropCapImage": null, "markups": [{ "__typename": "Markup", "type": "CODE", "start": 0, "end": 18, "href": null, "anchorType": null, "userId": null, "linkMetadata": null }], "codeBlockMetadata": null, "iframe": null, "mixtapeMetadata": null }, "Paragraph:6ecbd3f52f06_12": { "__typename": "Paragraph", "id": "6ecbd3f52f06_12", "name": "f7da", "type": "ULI", "href": null, "layout": null, "metadata": null, "text": "The DiffUtil.calculateDiff method returns a DiffUtil.DiffResult object containing the minimal set of changes required (insertions, deletions, or changes).", "hasDropCap": null, "dropCapImage": null, "markups": [{ "__typename": "Markup", "type": "CODE", "start": 4, "end": 26, "href": null, "anchorType": null, "userId": null, "linkMetadata": null }, { "__typename": "Markup", "type": "CODE", "start": 44, "end": 63, "href": null, "anchorType": null, "userId": null, "linkMetadata": null }], "codeBlockMetadata": null, "iframe": null, "mixtapeMetadata": null }, "Paragraph:6ecbd3f52f06_13": { "__typename": "Paragraph", "id": "6ecbd3f52f06_13", "name": "f995", "type": "ULI", "href": null, "layout": null, "metadata": null, "text": "We update the adapter’s internal data list to the new list (tasks = newTasks).", "hasDropCap": null, "dropCapImage": null, "markups": [{ "__typename": "Markup", "type": "CODE", "start": 60, "end": 76, "href": null, "anchorType": null, "userId": null, "linkMetadata": null }], "codeBlockMetadata": null, "iframe": null, "mixtapeMetadata": null }, "Paragraph:6ecbd3f52f06_14": { "__typename": "Paragraph", "id": "6ecbd3f52f06_14", "name": "5714", "type": "ULI", "href": null, "layout": null, "metadata": null, "text": "Finally, we call diffResult.dispatchUpdatesTo(this) which efficiently updates the RecyclerView based on the calculated changes, avoiding unnecessary full view refreshes.", "hasDropCap": null, "dropCapImage": null, "markups": [{ "__typename": "Markup", "type": "CODE", "start": 17, "end": 51, "href": null, "anchorType": null, "userId": null, "linkMetadata": null }], "codeBlockMetadata": null, "iframe": null, "mixtapeMetadata": null }, "Paragraph:6ecbd3f52f06_15": { "__typename": "Paragraph", "id": "6ecbd3f52f06_15", "name": "6a57", "type": "P", "href": null, "layout": null, "metadata": null, "text": "Benefits:", "hasDropCap": null, "dropCapImage": null, "markups": [{ "__typename": "Markup", "type": "STRONG", "start": 0, "end": 9, "href": null, "anchorType": null, "userId": null, "linkMetadata": null }], "codeBlockMetadata": null, "iframe": null, "mixtapeMetadata": null }, "Paragraph:6ecbd3f52f06_16": { "__typename": "Paragraph", "id": "6ecbd3f52f06_16", "name": "d853", "type": "P", "href": null, "layout": null, "metadata": null, "text": "In this example, DiffUtil helps efficiently update the UI only for tasks that have actually changed (completed or not). This improves performance and provides a smoother user experience.", "hasDropCap": null, "dropCapImage": null, "markups": [], "codeBlockMetadata": null, "iframe": null, "mixtapeMetadata": null }, "Paragraph:6ecbd3f52f06_17": { "__typename": "Paragraph", "id": "6ecbd3f52f06_17", "name": "6ef6", "type": "P", "href": null, "layout": null, "metadata": null, "text": "Additional Notes:", "hasDropCap": null, "dropCapImage": null, "markups": [{ "__typename": "Markup", "type": "STRONG", "start": 0, "end": 17, "href": null, "anchorType": null, "userId": null, "linkMetadata": null }], "codeBlockMetadata": null, "iframe": null, "mixtapeMetadata": null }, "Paragraph:6ecbd3f52f06_18": { "__typename": "Paragraph", "id": "6ecbd3f52f06_18", "name": "de2b", "type": "ULI", "href": null, "layout": null, "metadata": null, "text": "You can customize the comparison logic in DiffUtil.ItemCallback based on your data structure and needs.", "hasDropCap": null, "dropCapImage": null, "markups": [{ "__typename": "Markup", "type": "CODE", "start": 42, "end": 63, "href": null, "anchorType": null, "userId": null, "linkMetadata": null }], "codeBlockMetadata": null, "iframe": null, "mixtapeMetadata": null }, "Paragraph:6ecbd3f52f06_19": { "__typename": "Paragraph", "id": "6ecbd3f52f06_19", "name": "90b2", "type": "ULI", "href": null, "layout": null, "metadata": null, "text": "This is a basic example. DiffUtil offers additional methods for more complex scenarios like handling moved items.", "hasDropCap": null, "dropCapImage": null, "markups": [], "codeBlockMetadata": null, "iframe": null, "mixtapeMetadata": null }, "UserViewerEdge:userId:709acf7c07e3-viewerId:4954827388ef": { "__typename": "UserViewerEdge", "id": "userId:709acf7c07e3-viewerId:4954827388ef", "isMuting": false }, "PostViewerEdge:postId:729615b3528c-viewerId:4954827388ef": { "__typename": "PostViewerEdge", "shouldIndexPostForExternalSearch": true, "id": "postId:729615b3528c-viewerId:4954827388ef" }, "Tag:android": { "__typename": "Tag", "id": "android", "displayTitle": "Android", "normalizedTagSlug": "android" }, "Tag:android-app-development": { "__typename": "Tag", "id": "android-app-development", "displayTitle": "Android App Development", "normalizedTagSlug": "android-app-development" }, "Tag:android-recyclerview": { "__typename": "Tag", "id": "android-recyclerview", "displayTitle": "Android Recyclerview", "normalizedTagSlug": "android-recyclerview" }, "Tag:android-diffutil": { "__typename": "Tag", "id": "android-diffutil", "displayTitle": "Android Diffutil", "normalizedTagSlug": "android-diffutil" }, "Post:729615b3528c": { "__typename": "Post", "id": "729615b3528c", "collection": null, "content({\"postMeteringOptions\":{\"referrer\":\"\"}})": { "__typename": "PostContent", "isLockedPreviewOnly": false, "bodyModel": { "__typename": "RichText", "sections": [{ "__typename": "Section", "name": "28d2", "startIndex": 0, "textLayout": null, "imageLayout": null, "backgroundImage": null, "videoLayout": null, "backgroundVideo": null }], "paragraphs": [{ "__ref": "Paragraph:6ecbd3f52f06_0" }, { "__ref": "Paragraph:6ecbd3f52f06_1" }, { "__ref": "Paragraph:6ecbd3f52f06_2" }, { "__ref": "Paragraph:6ecbd3f52f06_3" }, { "__ref": "Paragraph:6ecbd3f52f06_4" }, { "__ref": "Paragraph:6ecbd3f52f06_5" }, { "__ref": "Paragraph:6ecbd3f52f06_6" }, { "__ref": "Paragraph:6ecbd3f52f06_7" }, { "__ref": "Paragraph:6ecbd3f52f06_8" }, { "__ref": "Paragraph:6ecbd3f52f06_9" }, { "__ref": "Paragraph:6ecbd3f52f06_10" }, { "__ref": "Paragraph:6ecbd3f52f06_11" }, { "__ref": "Paragraph:6ecbd3f52f06_12" }, { "__ref": "Paragraph:6ecbd3f52f06_13" }, { "__ref": "Paragraph:6ecbd3f52f06_14" }, { "__ref": "Paragraph:6ecbd3f52f06_15" }, { "__ref": "Paragraph:6ecbd3f52f06_16" }, { "__ref": "Paragraph:6ecbd3f52f06_17" }, { "__ref": "Paragraph:6ecbd3f52f06_18" }, { "__ref": "Paragraph:6ecbd3f52f06_19" }] }, "validatedShareKey": "", "shareKeyCreator": null }, "creator": { "__ref": "User:709acf7c07e3" }, "inResponseToEntityType": null, "isLocked": false, "isMarkedPaywallOnly": false, "lockedSource": "LOCKED_POST_SOURCE_NONE", "mediumUrl": "https:\u002F\u002Fmedium.com\u002F@sandeepkella23\u002Fusing-diffutil-itemcallback-for-efficient-recyclerview-updates-729615b3528c", "primaryTopic": null, "topics": [{ "__typename": "Topic", "slug": "android-development" }, { "__typename": "Topic", "slug": "ios-development" }, { "__typename": "Topic", "slug": "programming" }], "isPublished": true, "latestPublishedVersion": "6ecbd3f52f06", "visibility": "PUBLIC", "postResponses": { "__typename": "PostResponses", "count": 0 }, "responseDistribution": "NOT_DISTRIBUTED", "clapCount": 0, "allowResponses": true, "isLimitedState": false, "title": "Using DiffUtil.ItemCallback for Efficient RecyclerView Updates", "isSeries": false, "sequence": null, "uniqueSlug": "using-diffutil-itemcallback-for-efficient-recyclerview-updates-729615b3528c", "socialTitle": "", "socialDek": "", "canonicalUrl": "", "metaDescription": "", "latestPublishedAt": 1715817094732, "readingTime": 1.6566037735849055, "previewContent": { "__typename": "PreviewContent", "subtitle": "Here’s an explanation of DiffUtil.ItemCallback with a sample use case and code:" }, "previewImage": { "__ref": "ImageMetadata:1*9-tDBevuDRdN2pMUN5GJhg.png" }, "isShortform": false, "seoTitle": "", "firstPublishedAt": 1715817094732, "updatedAt": 1732619321326, "shortformType": "SHORTFORM_TYPE_LINK", "seoDescription": "", "viewerEdge": { "__ref": "PostViewerEdge:postId:729615b3528c-viewerId:4954827388ef" }, "isSuspended": false, "license": "ALL_RIGHTS_RESERVED", "tags": [{ "__ref": "Tag:android" }, { "__ref": "Tag:android-app-development" }, { "__ref": "Tag:android-recyclerview" }, { "__ref": "Tag:android-diffutil" }], "isNewsletter": false, "statusForCollection": null, "pendingCollection": null, "detectedLanguage": "en", "wordCount": 386, "layerCake": 0, "responsesLocked": false } }</script>
  2489. <script src="https://cdn-client.medium.com/lite/static/js/manifest.1414700e.js"></script>
  2490. <script src="https://cdn-client.medium.com/lite/static/js/9865.1496d74a.js"></script>
  2491. <script src="https://cdn-client.medium.com/lite/static/js/main.67cc6133.js"></script>
  2492. <script src="https://cdn-client.medium.com/lite/static/js/instrumentation.d9108df7.chunk.js"></script>
  2493. <script src="https://cdn-client.medium.com/lite/static/js/reporting.ff22a7a5.chunk.js"></script>
  2494. <script src="https://cdn-client.medium.com/lite/static/js/5049.d1ead72d.chunk.js"></script>
  2495. <script src="https://cdn-client.medium.com/lite/static/js/4436.36c1a067.chunk.js"></script>
  2496. <script src="https://cdn-client.medium.com/lite/static/js/6618.db187378.chunk.js"></script>
  2497. <script src="https://cdn-client.medium.com/lite/static/js/2707.a4e221ac.chunk.js"></script>
  2498. <script src="https://cdn-client.medium.com/lite/static/js/9977.933c1c9a.chunk.js"></script>
  2499. <script src="https://cdn-client.medium.com/lite/static/js/8599.73cb8339.chunk.js"></script>
  2500. <script src="https://cdn-client.medium.com/lite/static/js/5250.0e056565.chunk.js"></script>
  2501. <script src="https://cdn-client.medium.com/lite/static/js/8346.be5bef41.chunk.js"></script>
  2502. <script src="https://cdn-client.medium.com/lite/static/js/2648.26563adf.chunk.js"></script>
  2503. <script src="https://cdn-client.medium.com/lite/static/js/8393.a4ecfb83.chunk.js"></script>
  2504. <script src="https://cdn-client.medium.com/lite/static/js/4863.c36d9f71.chunk.js"></script>
  2505. <script src="https://cdn-client.medium.com/lite/static/js/9779.ab19e975.chunk.js"></script>
  2506. <script src="https://cdn-client.medium.com/lite/static/js/5642.bf6eafcf.chunk.js"></script>
  2507. <script src="https://cdn-client.medium.com/lite/static/js/6546.0da5aa17.chunk.js"></script>
  2508. <script src="https://cdn-client.medium.com/lite/static/js/6834.8aa8d357.chunk.js"></script>
  2509. <script src="https://cdn-client.medium.com/lite/static/js/4492.3e85e9f5.chunk.js"></script>
  2510. <script src="https://cdn-client.medium.com/lite/static/js/839.1c286b32.chunk.js"></script>
  2511. <script src="https://cdn-client.medium.com/lite/static/js/3259.1779fbde.chunk.js"></script>
  2512. <script src="https://cdn-client.medium.com/lite/static/js/7975.60bcefe8.chunk.js"></script>
  2513. <script src="https://cdn-client.medium.com/lite/static/js/144.e73a6d28.chunk.js"></script>
  2514. <script src="https://cdn-client.medium.com/lite/static/js/5794.9e8ff5dd.chunk.js"></script>
  2515. <script src="https://cdn-client.medium.com/lite/static/js/8204.d36bf1b6.chunk.js"></script>
  2516. <script src="https://cdn-client.medium.com/lite/static/js/4391.59acaed3.chunk.js"></script>
  2517. <script src="https://cdn-client.medium.com/lite/static/js/PostPage.MainContent.d97811b2.chunk.js"></script>
  2518. <script src="https://cdn-client.medium.com/lite/static/js/8414.6565ad5f.chunk.js"></script>
  2519. <script src="https://cdn-client.medium.com/lite/static/js/3974.8d3e0217.chunk.js"></script>
  2520. <script src="https://cdn-client.medium.com/lite/static/js/2527.acc94d39.chunk.js"></script>
  2521. <script src="https://cdn-client.medium.com/lite/static/js/PostResponsesContent.f8aff1b9.chunk.js"></script>
  2522. <script src="https://cdn-client.medium.com/lite/static/js/responses.editor.5a11f4da.chunk.js"></script>
  2523. <script>window.main();</script>
  2524. <script defer src="https://static.cloudflareinsights.com/beacon.min.js/vcd15cbe7772f49c399c6a5babf22c1241717689176015"
  2525. integrity="sha512-ZpsOmlRQV6y907TI0dKBHq9Md29nnaEIPlkf84rnaERnq6zvWvPUqr2ft8M1aS28oN72PdrCzSjY4U6VaAw1EQ=="
  2526. data-cf-beacon='{"rayId":"905f928fffe17d8f","serverTiming":{"name":{"cfExtPri":true,"cfL4":true,"cfSpeedBrain":true,"cfCacheStatus":true}},"version":"2025.1.0","token":"0b5f665943484354a59c39c6833f7078"}'
  2527. crossorigin="anonymous"></script>
  2528. </body>
  2529. </html>