package Ġcom . sun ny weather . android . ui . place Ċ Ċ import Ġandroidx . lifecycle .* Ċ import Ġcom . sun ny weather . android . logic . Repository Ċ import Ġcom . sun ny weather . android . logic . model . Place ĊĊ Ċ // éĢļå¸¸ æĿ¥ è®² ï¼Į æ¯Ķè¾ĥ å¥½çļĦ ç¼ĸç¨ĭ è§ĦèĮĥ æĺ¯ ç»Ļ æ¯ı ä¸Ģä¸ª Activity åĴĮ Fragment éĥ½ åĪĽå»ºä¸Ģä¸ª å¯¹åºĶçļĦ ViewModel Ċ // ViewModel çļĦä¸Ģä¸ª éĩįè¦ģ ä½ľçĶ¨ å°±æĺ¯ åı¯ä»¥ å¸®åĬ© Activity åĪĨ æĭħ ä¸Ģ éĥ¨åĪĨ å·¥ä½ľ ï¼Į å®ĥ æĺ¯ ä¸ĵ éĹ¨ çĶ¨äºİ åŃĺ æĶ¾ ä¸İ çķĮéĿ¢ çĽ¸åħ³ çļĦæķ°æį® çļĦ ãĢĤ ä¹Łå°±æĺ¯ è¯´ ï¼Į åıª è¦ģ æĺ¯ çķĮéĿ¢ ä¸Ĭ èĥ½ çľĭ å¾ĹåĪ° çļĦæķ°æį® ï¼Į å®ĥçļĦ çĽ¸åħ³ åıĺéĩı éĥ½ åºĶè¯¥ åŃĺ æĶ¾åľ¨ ViewModel ä¸Ń ï¼Į èĢĮä¸įæĺ¯ Activity ä¸Ń ï¼Į è¿Ļæł· åı¯ä»¥åľ¨ ä¸Ģå®ļ ç¨ĭ åº¦ ä¸Ĭ åĩı å°ĳ Activity ä¸ŃçļĦ éĢ»è¾ĳ Ċ // ViewModel è¿ĺ æľīä¸Ģä¸ª éĿŀå¸¸ éĩįè¦ģ çļĦ çī¹æĢ§ ãĢĤ æĪĳä»¬ éĥ½ çŁ¥éģĵ ï¼Į å½ĵ æīĭæľº åıĳçĶŁ æ¨ ª ç« ĸ å±ı æĹ ĭ è½¬ çļĦæĹ¶åĢĻ ï¼Į Activity ä¼ļ è¢« éĩįæĸ° åĪĽå»º ï¼Į åĲĮæĹ¶ åŃĺ æĶ¾åľ¨ Activity ä¸ŃçļĦ æķ°æį® ä¹Ł ä¼ļ ä¸ ¢ å¤± ãĢĤ èĢĮ ViewModel çļĦ çĶŁåĳ½ åĳ¨æľŁ åĴĮ Activity ä¸įåĲĮ ï¼Į å®ĥ åı¯ä»¥ ä¿Ŀè¯ģ åľ¨ æīĭæľº å±ı å¹ķ åıĳçĶŁ æĹ ĭ è½¬ çļĦæĹ¶åĢĻ ä¸įä¼ļ è¢« éĩįæĸ° åĪĽå»º ï¼Į åıªæľī å½ĵ Activity éĢĢåĩº çļĦæĹ¶åĢĻ æīį ä¼ļ è·Ł çĿĢ Activity ä¸Ģèµ· éĶĢ æ¯ ģ ãĢĤ åĽłæŃ¤ ï¼Į å°Ĩ ä¸İ çķĮéĿ¢ çĽ¸åħ³ çļĦ åıĺéĩı åŃĺ æĶ¾åľ¨ ViewModel å½ĵ ä¸Ń ï¼Į è¿Ļæł· åį³ ä½¿ æĹ ĭ è½¬ æīĭæľº å±ı å¹ķ ï¼Į çķĮéĿ¢ ä¸Ĭ æĺ¾ç¤º çļĦæķ°æį® ä¹Ł ä¸įä¼ļ ä¸ ¢ å¤± Ċ // LiveData ä¹ĭ æīĢä»¥ èĥ½å¤Ł æĪĲä¸º Activity ä¸İ ViewModel ä¹ĭéĹ´ éĢļä¿¡ çļĦ æ¡ ¥ æ¢ ģ ï¼Į å¹¶ä¸Ķ è¿ĺ ä¸įä¼ļ æľī åĨħåŃĺ æ³ Ħ æ¼ı çļĦ é£İ éĻ© ï¼Į éĿ ł çļĦ å°±æĺ¯ L ifec yc les ç»Ħä»¶ ãĢĤ LiveData åľ¨ åĨħéĥ¨ ä½¿çĶ¨ äºĨ L ifec yc les ç»Ħä»¶ æĿ¥ èĩª æĪĳ æĦŁ çŁ¥ çĶŁåĳ½ åĳ¨æľŁ çļĦ åıĺåĮĸ ï¼Į ä»İ èĢĮ åı¯ä»¥åľ¨ Activity éĶĢ æ¯ ģ çļĦæĹ¶åĢĻ åıĬ æĹ¶ éĩĬæĶ¾ å¼ķçĶ¨ ï¼Į éģ¿åħį äº§çĶŁ åĨħåŃĺ æ³ Ħ æ¼ı çļĦéĹ®é¢ĺ ãĢĤ Ċ // åı¦å¤ĸ ï¼Į çĶ±äºİ è¦ģ åĩı å°ĳ æĢ§èĥ½ æ¶Ī èĢĹ ï¼Į å½ĵ Activity å¤Ħ äºİ ä¸įåı¯ è§ģ çĬ¶æĢģ çļĦæĹ¶åĢĻ ï¼Ī æ¯Ķå¦Ĥ æīĭæľº æģ¯ å±ı ï¼Į æĪĸèĢħ è¢« åħ¶ä»ĸ çļĦ Activity éģ ® æĮ ¡ ï¼īï¼Į å¦Ĥæŀľ LiveData ä¸ŃçļĦ æķ°æį® åıĳçĶŁ äºĨ åıĺåĮĸ ï¼Į æĺ¯ ä¸įä¼ļ éĢļçŁ¥ ç»Ļ è§Ĥ å¯Ł èĢħ çļĦ ãĢĤ åıªæľī å½ĵ Activity éĩįæĸ° æģ ¢å¤į åı¯ è§ģ çĬ¶æĢģ æĹ¶ ï¼Į æīį ä¼ļ å°Ĩ æķ°æį® éĢļçŁ¥ ç»Ļ è§Ĥ å¯Ł èĢħ ï¼Į èĢĮ LiveData ä¹ĭ æīĢä»¥ èĥ½å¤Ł å®ŀçİ° è¿Ļç§į ç»Ĩ èĬĤ çļĦ ä¼ĺåĮĸ ï¼Į ä¾Ŀ éĿ ł çļĦ è¿ĺæĺ¯ L ifec yc les ç»Ħä»¶ ãĢĤ Ċ // è¿ĺ æľīä¸Ģä¸ª å°ı ç»Ĩ èĬĤ ï¼Į å¦Ĥæŀľ åľ¨ Activity å¤Ħ äºİ ä¸įåı¯ è§ģ çĬ¶æĢģ çļĦæĹ¶åĢĻ ï¼Į LiveData åıĳçĶŁ äºĨ å¤ļ æ¬¡ æķ°æį® åıĺåĮĸ ï¼Į å½ĵ Activity æģ ¢å¤į åı¯ è§ģ çĬ¶æĢģ æĹ¶ ï¼Į åıªæľī æľĢ æĸ°çļĦ éĤ£ ä»½ æķ°æį® æīį ä¼ļ éĢļçŁ¥ ç»Ļ è§Ĥ å¯Ł èĢħ ï¼Į åīį éĿ¢ çļĦæķ°æį® åľ¨ è¿Ļç§į æĥħåĨµä¸ĭ çĽ¸ å½ĵ äºİ å·²ç»ı è¿ĩ æľŁ äºĨ ï¼Į ä¼ļ è¢« çĽ´æİ¥ ä¸ ¢ å¼ĥ ãĢĤ Ċ // Place ViewModel çļĦ æķ´ ä½ĵ å·¥ä½ľ æµģç¨ĭ : é¦ĸåħĪ ï¼Į å½ĵ å¤ĸéĥ¨ è°ĥçĶ¨ Place ViewModel çļĦ search Places () æĸ¹æ³ķ æĿ¥ èİ·åıĸ çĶ¨æĪ· æķ°æį® æĹ¶ ï¼Į å¹¶ ä¸įä¼ļ åıĳ èµ· ä»»ä½ķ è¯·æ±Ĥ æĪĸèĢħ åĩ½æķ° è°ĥçĶ¨ ï¼Į åıª ä¼ļ å°Ĩ ä¼łåħ¥ çļĦ query åĢ¼ è®¾ç½® åĪ° search LiveData å½ĵ ä¸Ń ãĢĤ ä¸Ģ æĹ ¦ search LiveData çļĦæķ°æį® åıĳçĶŁ åıĺåĮĸ ï¼Į éĤ£ä¹Ī è§Ĥ å¯Ł search LiveData çļĦ switch Map () æĸ¹æ³ķ å°±ä¼ļ æī§è¡Į ï¼Į å¹¶ä¸Ķ è°ĥçĶ¨ æĪĳä»¬ ç¼ĸåĨĻ çļĦ è½¬æį¢ åĩ½æķ° ãĢĤ çĦ¶åĲİ åľ¨ è½¬æį¢ åĩ½æķ° ä¸Ń è°ĥçĶ¨ Repository . search Places () æĸ¹æ³ķ èİ·åıĸ çľŁ æŃ£ çļĦ æĲľç´¢ åŁİ å¸Ĥ ç»ĵæŀľ ãĢĤ åĲĮæĹ¶ ï¼Į switch Map () æĸ¹æ³ķ ä¼ļ å°Ĩ Repository . search Places () æĸ¹æ³ķ è¿ĶåĽŀ çļĦ LiveData å¯¹è±¡ è½¬æį¢ æĪĲ ä¸Ģä¸ª åı¯ è§Ĥ å¯Ł çļĦ LiveData å¯¹è±¡ ï¼Į å¯¹äºİ Place Fragment èĢĮ è¨Ģ ï¼Į åıª è¦ģ åİ» è§Ĥ å¯Ł è¿Ļä¸ª LiveData å¯¹è±¡ å°±åı¯ä»¥ äºĨ Ċ class ĠPlace ViewModel Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġ// LiveData æĺ¯ Jet pack æıĲä¾Ľ çļĦ ä¸Ģç§į åĵįåºĶ å¼ı ç¼ĸç¨ĭ ç»Ħä»¶ ï¼Į å®ĥ åı¯ä»¥ åĮħåĲ« ä»»ä½ķ ç±»åŀĭ çļĦæķ°æį® ï¼Į å¹¶ åľ¨ æķ°æį® åıĳçĶŁ åıĺåĮĸ çļĦæĹ¶åĢĻ éĢļçŁ¥ ç»Ļ è§Ĥ å¯Ł èĢħ ãĢĤ LiveData çī¹ åĪ« éĢĤ åĲĪ ä¸İ ViewModel ç»ĵ åĲĪ åľ¨ ä¸Ģèµ· ä½¿çĶ¨ ï¼Į èĻ½çĦ¶ å®ĥ ä¹Łåı¯ä»¥ åįķ çĭ¬ çĶ¨ åľ¨ åĪ« çļĦ åľ°æĸ¹ ï¼Į ä½Ĩæĺ¯ åľ¨ ç»Ŀ å¤§ å¤ļ æķ° æĥħåĨµä¸ĭ ï¼Į å®ĥ æĺ¯ ä½¿çĶ¨ åľ¨ ViewModel å½ĵ ä¸ŃçļĦ ãĢĤ ĊĠĠĠ Ġ// è¿ĻéĩĮ æĪĳä»¬ å°Ĩ search LiveData åıĺéĩı ä¿®æĶ¹ æĪĲ äºĨä¸Ģä¸ª Mutable LiveData å¯¹è±¡ ï¼Į å¹¶ æĮĩå®ļ å®ĥçļĦ æ³Ľ åŀĭ ä¸º String ï¼Į è¡¨ç¤º å®ĥ åĮħåĲ« çļĦæĺ¯ åŃĹç¬¦ä¸² æķ°æį® ãĢĤ Mutable LiveData æĺ¯ ä¸Ģç§į åı¯ åıĺ çļĦ LiveData ĊĠĠĠ Ġ// å°Ĩ search LiveData å£°æĺİ æĪĲ äºĨ private ï¼Į ä»¥ ä¿Ŀè¯ģ æķ°æį®çļĦ å°ģè£ħ æĢ§ ĊĠĠĠ Ġprivate Ġval Ġsearch LiveData Ġ= ĠMutable LiveData < String >() ĊĊĠĠĠ Ġ// place List æĺ¯åľ¨ Fragment ä¸Ń éľĢè¦ģ ä½¿çĶ¨çļĦ ä¸Ģä¸ª List < Place > ç±»åŀĭ çļĦæķ°æį® ( ä¸»è¦ģ çĶ¨äºİ RecyclerView çļĦ æĺ¾ç¤º )ï¼Į éľĢè¦ģ æĶ¾åľ¨ å¯¹åºĶçļĦ Place ViewModel ä¸Ń ĊĠĠĠ Ġval Ġplace List Ġ= ĠArrayList < Place >() ĊĊĠĠĠ Ġ// å¦Ĥæŀľ ViewModel ä¸ŃçļĦ æŁĲä¸ª LiveData å¯¹è±¡ æĺ¯ è°ĥçĶ¨ åı¦å¤ĸ çļĦæĸ¹æ³ķ èİ·åıĸ çļĦ ï¼Į éĤ£ä¹Ī æĪĳä»¬ å°±åı¯ä»¥ åĢ Ł åĬ© switch Map () æĸ¹æ³ķ ï¼Į å°Ĩ è¿Ļä¸ª LiveData å¯¹è±¡ è½¬æį¢ æĪĲ åı¦å¤ĸ ä¸Ģä¸ª åı¯ è§Ĥ å¯Ł çļĦ LiveData å¯¹è±¡ ĊĠĠĠ Ġval Ġplace LiveData Ġ= ĠTransform ations . switch Map ( search LiveData ) Ġ{ Ġquery Ġ-> // switch Map () æĸ¹æ³ķ åĲĮ æł· æİ¥æĶ¶ ä¸¤ä¸ª åıĤæķ° ï¼ļ ç¬¬ä¸Ģä¸ª åıĤæķ° ä¼łåħ¥ æĪĳä»¬ æĸ°å¢ŀ çļĦ search LiveData ï¼Į switch Map () æĸ¹æ³ķ ä¼ļ å¯¹ å®ĥ è¿Ľè¡Į è§Ĥ å¯Ł ï¼Ľ ç¬¬äºĮ ä¸ª åıĤæķ° æĺ¯ä¸Ģä¸ª è½¬æį¢ åĩ½æķ° ï¼Į æ³¨æĦı ï¼Į æĪĳä»¬ å¿ħé¡» åľ¨ è¿Ļä¸ª è½¬æį¢ åĩ½æķ° ä¸Ń è¿ĶåĽŀ ä¸Ģä¸ª LiveData å¯¹è±¡ ï¼Į åĽłä¸º switch Map () æĸ¹æ³ķ çļĦ å·¥ä½ľ åİŁ çĲĨ å°±æĺ¯ è¦ģ å°Ĩ è½¬æį¢ åĩ½æķ° ä¸Ń è¿ĶåĽŀ çļĦ LiveData å¯¹è±¡ è½¬æį¢ æĪĲ åı¦ ä¸Ģä¸ª åı¯ è§Ĥ å¯Ł çļĦ LiveData å¯¹è±¡ ãĢĤ éĤ£ä¹Ī å¾Ī æĺ¾ çĦ¶ ï¼Į æĪĳä»¬ åıª éľĢè¦ģ åľ¨ è½¬æį¢ åĩ½æķ° ä¸Ń è°ĥçĶ¨ Repository çļĦ search Places () æĸ¹æ³ķ æĿ¥ å¾ĹåĪ° LiveData å¯¹è±¡ ï¼Į å¹¶ å°Ĩ å®ĥ è¿ĶåĽŀ å°±åı¯ä»¥ äºĨ ĊĠĠĠĠĠĠĠ ĠRepository . search Places ( query ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// setValue () æĸ¹æ³ķ çĶ¨äºİ ç»Ļ LiveData è®¾ç½® æķ°æį® ï¼Į ä½Ĩæĺ¯ åıªèĥ½ åľ¨ ä¸» çº¿ç¨ĭ ä¸Ń è°ĥçĶ¨ ĊĠĠĠ Ġfun Ġsearch Places ( query : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsearch LiveData . value Ġ= Ġquery ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// å¯¹ åŃĺåĤ¨ åĴĮ è¯»åıĸ SharedPreferences çļĦæķ°æį® æĸ¹æ³ķ è¿Ľè¡Į å°ģè£ħ ĊĠĠĠ Ġfun Ġsave Place ( place : Place )= Repository . save Place ( place ) ĊĠĠĠ Ġfun Ġget Saved Place () = ĠRepository . get Save Place () ĊĠĠĠ Ġfun Ġis Place Saved () = Repository . is Place Saved () ĊĊĊ Ċ }