日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Android 基于MediatorLiveData實(shí)現(xiàn)紅點(diǎn)的統(tǒng)一管理

瀏覽:28日期:2022-09-19 17:38:53
背景

小紅點(diǎn)在各個(gè)App內(nèi)隨處可見,并且隨著需求的不斷迭代,需要展示小紅點(diǎn)的需求越來(lái)越多。

不同需求之間,紅點(diǎn)顯示可能有沖突。 不同頁(yè)面之間,紅點(diǎn)顯示會(huì)有關(guān)聯(lián)。 同一個(gè)紅點(diǎn),可能顯示成數(shù)字樣式,紅點(diǎn)樣式,文案樣式。

這個(gè)時(shí)候,如果沒有對(duì)紅點(diǎn)的展示邏輯做一個(gè)統(tǒng)一的抽象和管理的話,就會(huì)感覺很復(fù)雜,后續(xù)也不太好維護(hù)。

本文會(huì)基于MediatorLiveData,實(shí)現(xiàn)對(duì)紅點(diǎn)的統(tǒng)一管理。

需求分析

這里舉個(gè)例子,常見的紅點(diǎn)場(chǎng)景,類似qq首頁(yè)左上角紅點(diǎn)的顯示。

4個(gè)頁(yè)面,由首頁(yè)進(jìn)入到隱私保護(hù)指引頁(yè)面,都有相應(yīng)的紅點(diǎn)View顯示,去引導(dǎo)用戶進(jìn)入到最里面的'隱私保護(hù)指引'頁(yè)面。 當(dāng)用戶點(diǎn)擊紅點(diǎn),進(jìn)入到'隱私保護(hù)指引'頁(yè)面后,隱私保護(hù)指引對(duì)應(yīng)的紅點(diǎn)就會(huì)消失,同時(shí)會(huì)觸發(fā)上級(jí)頁(yè)面的紅點(diǎn)刷新。

Android 基于MediatorLiveData實(shí)現(xiàn)紅點(diǎn)的統(tǒng)一管理

Android 基于MediatorLiveData實(shí)現(xiàn)紅點(diǎn)的統(tǒng)一管理

思路分析樹形模型

一個(gè)App的頁(yè)面本身就是分級(jí)的,對(duì)于頁(yè)面的訪問路徑本質(zhì)上就是個(gè)樹型結(jié)構(gòu)。 整體的實(shí)現(xiàn)思路是用樹形模型去管理不同頁(yè)面的紅點(diǎn)。

每個(gè)小紅點(diǎn)就是一個(gè)樹的節(jié)點(diǎn),父節(jié)點(diǎn)的小紅點(diǎn)是否顯示,取決于它的子節(jié)點(diǎn)的并集結(jié)果。 同一個(gè)頁(yè)面中的不同紅點(diǎn)。在樹中是同一個(gè)層級(jí),屬于兄弟關(guān)系,互相獨(dú)立。 子節(jié)點(diǎn)的狀態(tài)變化,會(huì)遞歸地去觸發(fā)父節(jié)點(diǎn)的狀態(tài)變化。

Android 基于MediatorLiveData實(shí)現(xiàn)紅點(diǎn)的統(tǒng)一管理

具體代碼實(shí)現(xiàn)

那對(duì)應(yīng)的代碼應(yīng)該如何實(shí)現(xiàn)呢,難道真的要手動(dòng)自己實(shí)現(xiàn)一棵樹?也不是不行,就是感覺有點(diǎn)小麻煩的樣子。 下面進(jìn)入正題。

MediatorLiveData

官方提供了MediatorLiveData。

通過addSource方法,可以監(jiān)聽另一個(gè)LiveData的數(shù)據(jù)變化 本身就是一個(gè)LiveData,可以被其他Observer觀察

這兩個(gè)特點(diǎn),剛好滿足我們的需求實(shí)現(xiàn)。比如MediatorLiveData A觀察 MediatorLiveData B,MediatorLiveData B觀察 MediatorLiveData C 和MediatorLiveData D。并且被觀察的LiveData發(fā)生變化,作為觀察的LiveData都能收到通知。

通過管理多個(gè)LiveData之間的關(guān)系,這樣就可以間接實(shí)現(xiàn)了一棵樹的模型。

Android 基于MediatorLiveData實(shí)現(xiàn)紅點(diǎn)的統(tǒng)一管理

public class MediatorLiveData<T> extends MutableLiveData<T> { private SafeIterableMap<LiveData<?>, Source<?>> mSources = new SafeIterableMap<>(); public <S> void addSource(@NonNull LiveData<S> source, @NonNull Observer<? super S> onChanged) { //使用Source包一下 Source<S> e = new Source<>(source, onChanged); Source<?> existing = mSources.putIfAbsent(source, e); if (hasActiveObservers()) { e.plug(); } } private static class Source<V> implements Observer<V> { final LiveData<V> mLiveData; final Observer<? super V> mObserver; int mVersion = START_VERSION; Source(LiveData<V> liveData, final Observer<? super V> observer) { mLiveData = liveData; mObserver = observer; } void plug() { mLiveData.observeForever(this); } void unplug() { mLiveData.removeObserver(this); } @Override public void onChanged(@Nullable V v) { if (mVersion != mLiveData.getVersion()) {mVersion = mLiveData.getVersion();mObserver.onChanged(v); } } }}RedPointManager 這里的實(shí)現(xiàn),封裝成一個(gè)單例RedPointManager,暴露相應(yīng)的紅點(diǎn)數(shù)據(jù)給外部。 LiveData數(shù)據(jù)驅(qū)動(dòng):RedPointManager內(nèi)包含了多個(gè)LiveData,不同頁(yè)面的紅點(diǎn)View可以通過觀察對(duì)應(yīng)的LiveData,來(lái)驅(qū)動(dòng)自身的視圖變化。 父節(jié)點(diǎn)使用MediatorLiveData,觀察相應(yīng)的子節(jié)點(diǎn)LiveData。 葉子節(jié)點(diǎn)定義成普通的LiveData就行了,因?yàn)椴恍枰^察其他對(duì)象了。

Android 基于MediatorLiveData實(shí)現(xiàn)紅點(diǎn)的統(tǒng)一管理

/** * 基于MediatorLiveData,實(shí)現(xiàn)樹形紅點(diǎn)管理 */class RedPointManager : IRedPointManager { companion object { val TAG = 'RedPointManager' @JvmStatic val instance: IRedPointManager by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { RedPointManager() } } override val liveDataA = MediatorLiveData<Boolean>() override val liveDataB1 = MediatorLiveData<Boolean>() override val liveDataB2 = MutableLiveData<Boolean>() override val liveDataC1 = MutableLiveData<Boolean>() override val liveDataC2 = MutableLiveData<Boolean>() init { Log.d(TAG, 'RedPointManager init') /** * 構(gòu)建樹型關(guān)系。按路徑層級(jí),進(jìn)行觀察。一般外部只需要改動(dòng)最低層的紅點(diǎn)對(duì)應(yīng)的LiveData,頂部的LiveData就會(huì)自動(dòng)改變 */ liveDataA.addSource(liveDataB1, Observer { liveDataA.postValue(liveDataB1.isTrue() || liveDataB2.isTrue()) }) liveDataA.addSource(liveDataB2, Observer { liveDataA.postValue(liveDataB1.isTrue() || liveDataB2.isTrue()) }) liveDataB1.addSource(liveDataC1, Observer { liveDataB1.postValue(liveDataC1.isTrue() || liveDataC2.isTrue()) }) liveDataB1.addSource(liveDataC2, Observer { liveDataB1.postValue(liveDataC1.isTrue() || liveDataC2.isTrue()) }) } override fun testChangeDataC1(show: Boolean) { liveDataC1.postValue(show) Log.d(TAG, 'testChangeDataC1: $show') }}/** * 定義接口 * 提供只讀的屬性,提供修改liveData的方法 */interface IRedPointManager { val liveDataA: LiveData<Boolean> val liveDataB1: LiveData<Boolean> val liveDataB2: LiveData<Boolean> val liveDataC1: LiveData<Boolean> val liveDataC2: LiveData<Boolean> fun testChangeDataC1(show: Boolean)}驗(yàn)證刷新邏輯

一般情況下,只需要改動(dòng)葉子節(jié)點(diǎn)的紅點(diǎn)對(duì)應(yīng)的LiveData,父節(jié)點(diǎn)的LiveData就會(huì)自動(dòng)改變。 基于上述代碼,調(diào)用testChangeDataC1方法后,監(jiān)聽LiveData并輸出日志。

private fun testRedPointManager() { RedPointManager.instance.liveDataA.observe(this, Observer { Log.d(TAG, 'liveDataA: $it') }) RedPointManager.instance.liveDataB1.observe(this, Observer { Log.d(TAG, 'liveDataB1: $it') }) RedPointManager.instance.liveDataB2.observe(this, Observer { Log.d(TAG, 'liveDataB2: $it') }) RedPointManager.instance.liveDataC1.observe(this, Observer { Log.d(TAG, 'liveDataC1: $it') }) RedPointManager.instance.liveDataC2.observe(this, Observer { Log.d(TAG, 'liveDataC2: $it') }) RedPointManager.instance.testChangeDataC1(true) } //從輸出日志可以發(fā)現(xiàn),底層的liveDataC1發(fā)生改變,觸發(fā)頂層的liveDataB1發(fā)生改變。liveDataB1的變化,也觸發(fā)了liveDataA發(fā)生改變。RedPointManager inittestChangeDataC1: trueliveDataC1: truelveDataB1: trueliveDataA: true總結(jié)

到這里就結(jié)束了,App端內(nèi)實(shí)現(xiàn)紅點(diǎn)的統(tǒng)一管理,如果有類似的場(chǎng)景,可以用這種思路去實(shí)現(xiàn)。 上面的例子比較簡(jiǎn)單,更復(fù)雜的場(chǎng)景,應(yīng)該也是可以基于上面的方案進(jìn)行改造一下的。

以上就是Android 基于MediatorLiveData實(shí)現(xiàn)紅點(diǎn)的統(tǒng)一管理的詳細(xì)內(nèi)容,更多關(guān)于MediatorLiveData實(shí)現(xiàn)紅點(diǎn)的統(tǒng)一管理的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Android
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美成人aaa| 中文字幕一区二区三区日韩精品| 男女性色大片免费观看一区二区| 99精品视频精品精品视频| 青青青免费在线视频| 国产suv精品一区二区四区视频| 你懂的网址国产 欧美| 鲁大师精品99久久久| 国产极品久久久久久久久波多结野| 国产欧美一区二区色老头| 综合国产在线| 日本不卡视频一二三区| 91综合久久爱com| 国产精品一区二区精品视频观看| 欧美日韩xxxx| 国产精品一区二区av日韩在线 | 久久一区欧美| 精品三级在线| 欧美激情另类| 久久国产毛片| 久久国产精品亚洲77777| 免费精品视频| 日韩精品视频网站| 69堂免费精品视频在线播放| 国产探花一区| 成人午夜在线| 国产精品99免费看| 久久aⅴ国产紧身牛仔裤| 亚洲精品国产精品粉嫩| 国产精品亲子伦av一区二区三区| 国产精品66| 97se综合| 野花国产精品入口| 五月国产精品| 久久午夜影院| 久久精品高清| 亚洲不卡视频| 高清在线一区| 日韩精品欧美| 蜜臀av在线播放一区二区三区| 欧美亚洲自偷自偷| 久久99蜜桃| 成人日韩精品| 亚洲欧美激情诱惑| 亚洲综合图色| 精品国产亚洲一区二区三区大结局| 婷婷激情一区| 亚洲精品影院在线观看| 麻豆免费精品视频| 五月婷婷亚洲| 国产丝袜一区| 亚洲手机视频| 欧美天堂一区| 久久亚洲在线| 亚洲午夜免费| 国产成人久久精品麻豆二区| 美女网站一区| 国产伦精品一区二区三区千人斩| 欧美日韩免费观看视频| 亚洲久久在线| 国产白浆在线免费观看| 免费不卡在线视频| 国产日韩免费| 欧美/亚洲一区| 国产日韩欧美一区在线| 美女久久久久| 精品久久不卡| 蜜桃免费网站一区二区三区| 久久一区精品| 亚洲自啪免费| 国产66精品| 日韩在线网址| 国产一区二区中文| 久久av中文| 麻豆精品91| 国产精品毛片一区二区在线看| 中文字幕乱码亚洲无线精品一区| 天堂8中文在线最新版在线| 中文字幕日韩高清在线| 久久精品成人| 国产精品久久久久久模特| 国产精品日韩久久久| 精品久久国产一区| 日本午夜精品久久久久| 亚洲天堂1区| 国产精品久久久久77777丨| 99亚洲视频| 久久91导航| 国产美女视频一区二区| 亚洲在线免费| 欧美va亚洲va日韩∨a综合色| 免费日韩成人| 综合干狼人综合首页| 欧美69视频| 国产高潮在线| 麻豆精品视频在线观看免费| 日韩精品国产精品| 亚洲一区中文| 久久久精品网| 国产精品xvideos88| 日韩影片在线观看| 亚洲欧美视频| 影音先锋久久| 久久精品在线| 国产v日韩v欧美v| 麻豆视频观看网址久久| 欧美亚洲色图校园春色| 日本大胆欧美人术艺术动态| 亚洲二区三区不卡| 久久久久蜜桃| 欧美一区久久久| 久久亚洲精品中文字幕| 久久爱www.| 久久久精品国产**网站| 婷婷成人av| 日本不卡在线视频| 日韩欧美高清一区二区三区| 日韩在线观看一区二区| 99国产精品视频免费观看一公开 | 日韩三区四区| 欧美日韩精品免费观看视完整| 国产日韩在线观看视频| 国产精品xvideos88| 亚洲综合电影| 蜜桃视频一区二区三区在线观看| 97精品一区| 日韩高清不卡在线| 国产在线一区不卡| 亚洲精品激情| 日韩成人精品一区| 日韩一区二区三区在线看| 国产精品三级| 青青国产精品| 久久精品青草| 男女性色大片免费观看一区二区| 视频一区日韩精品| 国产成人免费视频网站视频社区| 制服诱惑一区二区| 欧美激情另类| 亚洲一区二区三区在线免费| 99精品在线| 香蕉人人精品| 成人免费电影网址| 欧美午夜精彩| 一区二区视频欧美| 视频一区二区三区在线| 亚洲免费资源| 国产日韩视频在线| 国产+成+人+亚洲欧洲在线| 久久久久国产| 中文无码久久精品| 日韩va亚洲va欧美va久久| 国产欧美日韩精品一区二区三区| 亚洲最大av| 国产精品蜜月aⅴ在线| 韩国一区二区三区视频| 99成人超碰| 美女久久一区| 欧美亚洲福利| 日韩欧美字幕| 免费日韩视频| 国产日本久久| 不卡一二三区| 99在线精品免费视频九九视| 日韩va欧美va亚洲va久久| 精品国产午夜| 欧美福利专区| 日本免费新一区视频| 麻豆精品在线观看| 999国产精品永久免费视频app| 视频一区二区三区中文字幕| 国产激情久久| 视频一区中文| 日本午夜精品久久久久| 欧美xxxx中国| 久久亚洲国产精品一区二区| 在线精品视频一区| 亚洲国产专区| 亚洲一区免费| 成人在线黄色| 国产欧美在线观看免费| 精品一区二区三区中文字幕视频 | 国产欧美一区二区精品久久久 | 久久精品一区二区国产| 日韩电影在线视频| 欧美xxxx中国| 99久久99久久精品国产片果冰| 亚洲麻豆一区| 国产精品美女午夜爽爽| 日韩毛片视频| 成人三级高清视频在线看| 久久免费精品| 国产一区二区三区亚洲综合| 国产亚洲一卡2卡3卡4卡新区| 亚洲精品va| 男女激情视频一区| 亚洲一区国产一区| 亚洲欧美日韩视频二区| 国产一区二区三区四区五区| 中文字幕一区二区三区日韩精品 |