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

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

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

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

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

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

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

本文會基于MediatorLiveData,實現(xiàn)對紅點的統(tǒng)一管理。

需求分析

這里舉個例子,常見的紅點場景,類似qq首頁左上角紅點的顯示。

4個頁面,由首頁進入到隱私保護指引頁面,都有相應(yīng)的紅點View顯示,去引導用戶進入到最里面的'隱私保護指引'頁面。 當用戶點擊紅點,進入到'隱私保護指引'頁面后,隱私保護指引對應(yīng)的紅點就會消失,同時會觸發(fā)上級頁面的紅點刷新。

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

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

思路分析樹形模型

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

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

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

具體代碼實現(xiàn)

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

MediatorLiveData

官方提供了MediatorLiveData。

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

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

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

Android 基于MediatorLiveData實現(xià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 這里的實現(xiàn),封裝成一個單例RedPointManager,暴露相應(yīng)的紅點數(shù)據(jù)給外部。 LiveData數(shù)據(jù)驅(qū)動:RedPointManager內(nèi)包含了多個LiveData,不同頁面的紅點View可以通過觀察對應(yīng)的LiveData,來驅(qū)動自身的視圖變化。 父節(jié)點使用MediatorLiveData,觀察相應(yīng)的子節(jié)點LiveData。 葉子節(jié)點定義成普通的LiveData就行了,因為不需要觀察其他對象了。

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

/** * 基于MediatorLiveData,實現(xià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)系。按路徑層級,進行觀察。一般外部只需要改動最低層的紅點對應(yīng)的LiveData,頂部的LiveData就會自動改變 */ 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)}驗證刷新邏輯

一般情況下,只需要改動葉子節(jié)點的紅點對應(yīng)的LiveData,父節(jié)點的LiveData就會自動改變。 基于上述代碼,調(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)實現(xiàn)紅點的統(tǒng)一管理,如果有類似的場景,可以用這種思路去實現(xiàn)。 上面的例子比較簡單,更復雜的場景,應(yīng)該也是可以基于上面的方案進行改造一下的。

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

標簽: Android
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
在线国产一区| 精品久久视频| 91精品国产成人观看| 成人亚洲一区二区| 九九久久国产| 色婷婷色综合| 日韩理论视频| 日韩不卡视频在线观看| 亚洲电影在线| 欧美日韩国产免费观看视频| 女主播福利一区| 一本一道久久a久久精品蜜桃| 一区二区三区四区日本视频| 在线看片福利| 国产99久久| 欧美日韩激情在线一区二区三区| 亚洲一区二区免费看| 亚洲精品自拍| 久久国产三级精品| 精品一级视频| 久久精品国产68国产精品亚洲| 婷婷综合社区| 久热re这里精品视频在线6| 免费精品视频在线| 日韩不卡在线观看日韩不卡视频| 国产欧美日韩一区二区三区四区 | 亚洲一区二区三区四区电影| 亚洲一区二区三区中文字幕在线观看| 亚洲精品国产日韩| 国产精品探花在线观看| 亚洲va中文在线播放免费| 红桃视频国产精品| 91成人在线网站| 国产不卡一区| 性欧美xxxx免费岛国不卡电影| 日韩视频中文| 欧美天堂一区| 国产亚洲一区二区手机在线观看| 国产精品色网| 国产精品第一国产精品| 欧美日韩视频免费观看| 免费视频一区二区| 麻豆精品视频在线观看| 日本а中文在线天堂| 99国产精品久久久久久久| 亚洲91网站| 国产精品久久久久久久免费观看| 国产视频一区免费看| 欧美激情99| 尤物tv在线精品| 日本午夜精品一区二区三区电影| 成人三级高清视频在线看| 久久高清国产| 国产色播av在线| 视频一区日韩| 久久久久欧美精品| 日韩1区2区日韩1区2区| 天堂日韩电影| 欧美日韩调教| 在线国产一区二区| 国产情侣一区在线| 欧美特黄视频| 福利一区二区| 涩涩涩久久久成人精品| av综合电影网站| 日韩在线视频一区二区三区| 91免费精品| 婷婷成人av| 91精品婷婷色在线观看| 久久国产日韩欧美精品| 黄色免费成人| 国产精品黑丝在线播放| 日韩av三区| 一区久久精品| 成人午夜亚洲| 日本欧美一区| 国产美女精品| 桃色一区二区| 欧美aⅴ一区二区三区视频| 日韩一区二区免费看| 给我免费播放日韩视频| 91成人在线| 视频一区视频二区中文| 婷婷激情久久| 国产成人精品一区二区三区免费 | 青青草国产精品亚洲专区无| 国产国产精品| 久久久91麻豆精品国产一区| 免费视频最近日韩| 在线观看免费一区二区| 日韩欧美国产精品综合嫩v| 国产福利资源一区| 日韩动漫一区| 热久久久久久久| 午夜国产欧美理论在线播放| 国产夫妻在线| 国产成人77亚洲精品www| 国产毛片精品| 91成人福利| 伊人国产精品| 亚洲欧美激情诱惑| 欧美/亚洲一区| 亚洲黄色网址| 欧美a一区二区| 国产精品v日韩精品v欧美精品网站| 日韩高清在线观看一区二区| 久久99伊人| 亚洲一区中文| 欧美日韩中文一区二区| 91精品国产乱码久久久久久久 | 亚洲免费一区二区| 欧美美女一区| 久久九九99| 久久婷婷一区| 特黄特色欧美大片| 秋霞影视一区二区三区| 日本高清不卡一区二区三区视频 | 蜜桃av一区二区在线观看| 亚洲黄页一区| 99国产精品久久久久久久成人热| 国产综合视频| 欧美日韩激情在线一区二区三区| 国产一区亚洲| 激情欧美一区二区三区| 欧美日韩尤物久久| 中文字幕高清在线播放| 欧美精品资源| 九九久久电影| 中文日韩在线| 亚洲精品无播放器在线播放| 亚洲精品大全| 欧美日韩午夜| 久久精品一本| 日韩在线二区| 亚洲国内精品| 亚洲一区二区三区高清不卡| 在线精品观看| 欧美在线看片| 精品一区二区三区中文字幕在线| 91一区二区| а√在线中文在线新版| 国产综合色产| 亚洲精品乱码日韩| 欧美啪啪一区| 精品日韩一区| 日韩精品看片| 另类国产ts人妖高潮视频| 日韩在线麻豆| 久久一区亚洲| 99久久久久国产精品| 亚洲一区日韩在线| 欧美日一区二区在线观看| 精品午夜av| 91精品一区国产高清在线gif| 国产亚洲网站| 日本成人精品| 精品网站aaa| 久久夜夜操妹子| 免费日韩精品中文字幕视频在线| 日韩黄色av| 高清日韩欧美| 在线一区欧美| 国产精品视频一区视频二区| 播放一区二区| 亚洲精品国产精品粉嫩| 精品中文字幕一区二区三区| 久久精品国产99久久| 亚洲精品少妇| 国产精品成人a在线观看| 亚洲欧美一区在线| 日韩中文字幕亚洲一区二区va在线 | 日韩成人三级| 午夜国产精品视频| 欧美精品三级在线| 丝袜美腿诱惑一区二区三区| 亚洲欧洲国产精品一区| 麻豆视频观看网址久久| 午夜欧美理论片| 国产日韩高清一区二区三区在线| 欧美黄色网页| 日韩国产欧美一区二区三区| 欧美日韩免费看片| 亚洲开心激情| 精品日本视频| 免费一级片91| 中文在线а√在线8| 亚洲v天堂v手机在线| 97精品中文字幕| 中文字幕日韩高清在线| 成人三级高清视频在线看| 综合激情五月婷婷| 久久久久久网| 日本不卡一区二区三区| 久久精品亚洲欧美日韩精品中文字幕| 日韩精品免费一区二区夜夜嗨| 久久毛片亚洲| 久久精品av麻豆的观看方式| 波多野结衣一区| 麻豆中文一区二区| 视频一区在线视频|