android实现自动升级红点的系统
来源:colinWong     阅读:570
源码超市
发布于 2019-03-25 23:37
查看主页

写了一个demo可以自动显示红点,在其余界面红点数变化,对应的父界面的红点也会发生变化。

如下图:

image

设计思路:

每个红点可视为为一个节点,每个节点都可以作为父节点或者子节点,相似树状。与树状不一样的是,子节点可以有多个父节点(例如在一个子页面里面的红点有多个快捷入口红点)。

节点数据结构:

1.点数

2.子节点列表

3.父节点列表。如下图

实现算法:只有子节点可主动设置数据变化,当一个个子节点的数据发生变化,需要通知父节点重新计算点数,计算方法为将所有子节点点数相加,而后递归触发父节点计算方法,向上刷新数据。父节点可以做清零操作,即把所有子节点点数置0,向下递归清零,并且向上递归计算点数。下图是一个例子


image

代码例子:
其实只有两个类

Reddot 为控制红点的类,包含标识key、红点值、父节点、子节点、自动计算通知升级接口等

ReddotManage 为维护Reddot的类

public class ReddotList {public static ReddotmainReddot =new Reddot("mainReddot");    public static ReddotsecondReedot1 =new Reddot("secondReedot1",mainReddot);    public static  ReddotsecondReedot2 =new Reddot("secondReedot2",mainReddot);    public static void init(){        secondReedot1.addOne();        secondReedot2.addOne();    }}

数据需要再使用前初始化、这里放在Application 这里了

public class DemoApplication extends Application {    @Override    public void onCreate() {        super.onCreate();        ReddotList.init();    }}

Activity有两个MainActivity 和 SecondActivity。MainActivty有个红点,改红点数值为 SecondActivity的红点数值总和

        //注册红点监听器        ReddotList.mainReddot.registerLisenter(this);

升级回调方法

  @Override    public void updateView(String key, int count) {        if (key.equals(ReddotList.mainReddot.getKey())) {            mMainDot.setVisibility(count > 0 ? View.VISIBLE : View.GONE);            mMainDot.setText(count + "");        }    }

红点点数变化方法,还有setValue等

@Override    public void onClick(View v) {        switch (v.getId()) {            case R.id.button_left_add:                ReddotList.secondReedot1.addOne();                break;            case R.id.button_left_reduce:                ReddotList.secondReedot1.reduceOne();                break;            case R.id.button_right_add:                ReddotList.secondReedot2.addOne();                break;            case R.id.button_right_reduce:                ReddotList.secondReedot2.reduceOne();                break;        }    }

页面被销毁时候记得调用unRegister 或者clearLinsenter 方法

 @Override    protected void onDestroy() {        super.onDestroy();        ReddotManager.clearLinsenter(ReddotList.secondReedot1.getKey());        ReddotManager.clearLinsenter(ReddotList.secondReedot2.getKey());    }

demo 地址: collinWong/AutoReddot

免责声明:本文为用户发表,不代表网站立场,仅供参考,不构成引导等用途。 系统环境 服务器应用
相关推荐
大数据 第一天 linux入门 及基本操作指令
假如想转行学编程,C/C++适合吗?嵌入式怎样样?
心流就是幸福与创造力的 忘我时刻
「重看vue」:v-if , v-show 区别
这 5 个让人窒息的烂代码,你看完都忍不了
首页
搜索
订单
购物车
我的