成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

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

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

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

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

不同需求之間,紅點(diǎn)顯示可能有沖突。 不同頁面之間,紅點(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首頁左上角紅點(diǎn)的顯示。

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

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

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

思路分析樹形模型

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

每個(gè)小紅點(diǎn)就是一個(gè)樹的節(jié)點(diǎn),父節(jié)點(diǎn)的小紅點(diǎn)是否顯示,取決于它的子節(jié)點(diǎn)的并集結(jié)果。 同一個(gè)頁面中的不同紅點(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,不同頁面的紅點(diǎn)View可以通過觀察對(duì)應(yīng)的LiveData,來驅(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)。 上面的例子比較簡單,更復(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)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
黄色成人精品网站| 欧美乱熟臀69xxxxxx| 欧美日韩成人综合在线一区二区| 亚洲美女视频在线观看| 欧美日韩1区| 久久综合久久99| 精久久久久久久久久久| 色噜噜狠狠色综合欧洲selulu| 亚洲精品成人少妇| 亚洲人www| 亚洲狼人国产精品| 亚洲经典在线| 亚洲蜜臀av乱码久久精品| 欧美婷婷久久| 中文字幕成人av| 欧美暴力喷水在线| 久久久久久久av麻豆果冻| 丁香一区二区三区| 在线成人免费观看| 国产精品一区二区你懂的| 欧美日韩和欧美的一区二区| 欧美日韩在线精品| 欧美视频一区二区三区四区| 欧美大胆人体bbbb| 欧美色国产精品| 日本美女视频一区二区| 久久国产欧美精品| 午夜私人影院久久久久| 噜噜噜91成人网| 亚洲gay无套男同| 一本大道久久精品懂色aⅴ| 日韩精品午夜视频| 久久一区二区精品| 日韩国产欧美在线播放| 在线观看www91| 看片的网站亚洲| 一本色道久久综合亚洲aⅴ蜜桃 | 91亚洲精品久久久蜜桃| 久久久91精品国产一区二区三区| 欧美中文一区二区三区| 国产日韩欧美电影| 国产精品hd| 亚洲少妇一区| 亚洲国产日韩精品| 色8久久人人97超碰香蕉987| 日韩综合小视频| 91黄色免费观看| 国产一区亚洲一区| 精品久久国产字幕高潮| 欧美黄污视频| 一区二区三区欧美| 久久九九免费| 精品在线一区二区| 精品裸体舞一区二区三区| 99这里都是精品| 国产精品色婷婷久久58| 一区二区三区四区五区视频| 亚洲成人午夜影院| 欧美猛男男办公室激情| av在线这里只有精品| 亚洲国产精华液网站w| 亚洲成人综合网站| 91精品国产麻豆| 日韩在线卡一卡二| 欧美午夜电影一区| 国产91清纯白嫩初高中在线观看 | 裸体素人女欧美日韩| 久久爱另类一区二区小说| 日韩精品一区二区三区四区| 狠狠色综合一区二区| 三级亚洲高清视频| 欧美体内she精视频| 成人黄页在线观看| 亚洲色图第一区| 91黄色免费版| 99国产精品一区| 洋洋av久久久久久久一区| 欧美美女视频在线观看| 亚洲欧美综合| 日韩制服丝袜av| 亚洲精品一区在线观看| 亚洲视频大全| 国产成人av影院| 亚洲三级电影网站| 欧美日韩一区国产| 国产精品久久| 日本成人在线不卡视频| 精品sm捆绑视频| 香蕉久久久久久久av网站| 久久精品国产秦先生| 国产欧美精品一区| 久久婷婷丁香| va亚洲va日韩不卡在线观看| 一区二区三区欧美| 精品久久久久久久久久久久包黑料| 99精品视频免费观看视频| 极品少妇一区二区三区精品视频| 亚洲国产精品传媒在线观看| 在线观看欧美精品| 国产精品mm| 国产在线视视频有精品| 综合欧美亚洲日本| 欧美另类videos死尸| 亚洲图色在线| 国产精品亚洲午夜一区二区三区| 综合激情网...| 欧美一区二区三区婷婷月色| 99精品欧美| 白白色 亚洲乱淫| 日韩精品欧美精品| 亚洲欧洲av在线| 日韩欧美一区二区在线视频| 99精品99| 成人av在线资源网站| 亚洲国产综合在线| 久久久久久久性| 欧美少妇bbb| 亚洲精品欧洲| hitomi一区二区三区精品| 天堂av在线一区| 国产精品色眯眯| 日韩欧美国产电影| 一本色道久久综合狠狠躁的推荐| 激情亚洲成人| 成人av在线资源网| 麻豆国产91在线播放| 亚洲男人的天堂一区二区| 精品久久一区二区| 欧美亚洲动漫另类| 国产精品久久久久久模特 | 久久久久久久久久久久久9999| 欧美欧美天天天天操| 国产91色综合久久免费分享| 免费成人在线视频观看| 亚洲欧美二区三区| 久久久精品免费免费| 欧美一区在线视频| 在线免费视频一区二区| 日韩午夜精品| 欧美在线视频二区| 国产激情视频一区二区三区欧美| 五月婷婷激情综合| 中文字幕一区二区三区精华液 | 国产日韩v精品一区二区| 欧美久久久久久久久久| 久久久人人人| 国产欧美激情| 欧美日韩网址| eeuss影院一区二区三区| 激情欧美日韩一区二区| 日韩激情视频网站| 亚洲国产精品一区二区久久恐怖片 | 亚洲综合一区二区| 国产午夜亚洲精品理论片色戒| 欧美日韩你懂得| 在线观看日韩高清av| 久久精品一区二区国产| 国产精品久久久久毛片大屁完整版| 激情视频一区二区| 狠色狠色综合久久| 欧美日韩亚洲一区二区三区在线观看| eeuss鲁一区二区三区| 国产黄色精品视频| 国产一区在线看| 精品一区二区三区香蕉蜜桃| 日韩在线一区二区三区| 日韩精品电影在线| 日韩电影在线一区二区三区| 日韩影视精彩在线| 日韩精品1区2区3区| 日韩成人免费在线| 天堂va蜜桃一区二区三区漫画版| 亚洲成人激情av| 亚洲第一综合色| 午夜影视日本亚洲欧洲精品| 亚洲不卡一区二区三区| 亚洲成人激情av| 亚洲va韩国va欧美va| 一区二区三区日韩欧美精品| 一区二区三区在线高清| 一区二区高清视频在线观看| 亚洲精品免费看| 亚洲一区二区三区在线看| 亚洲高清一区二区三区| 午夜激情综合网| 日本亚洲免费观看| 日本va欧美va欧美va精品| 蜜臀av国产精品久久久久| 老汉av免费一区二区三区| 韩国欧美国产1区| 国产成人在线观看| 国产成人在线视频播放| 国产成人福利片| 9i在线看片成人免费| 91蝌蚪国产九色| 黄色工厂这里只有精品| 国产精品一国产精品k频道56| 久久精品主播| 欧美精品丝袜中出| 亚洲精品一线二线三线无人区|