java - 使用RxJava观察List "add"和 "remove" Action

标签 java android list rx-java addition

我想知道是否可以使用 RxJava 来获取列表(更具体地说,ArrayList)上的更新。 我想要的是让 n 个订阅者在列表添加或删除项目时获得更新。我需要知道操作是什么,而不仅仅是修改的项目。

我尝试过搜索这个,但到目前为止我发现的最接近的是这个 answer

但是,这仅涵盖“添加”功能,而不涵盖“删除”功能...

最好的办法是在将项目添加到列表时调用一个函数 onAdd(Item item) ,然后在将项目添加到列表时调用另一个函数 onRemove(Item item)它被删除了。

如果这不是使用 RxJava 的正确方法,请告诉我,我正在学习并接受各种帮助/批评:)

谢谢, 伊斯克尔

最佳答案

有几种方法可以做到这一点。一种方法是添加第二个可观察量,这应该很容易。第二个选项是每次有通知时传递操作。

例如(使用 lombok 生成构造函数、getter 等):

public class ObservableListExample {

    @NoArgsConstructor
    public static class ObservableList<T> {

        protected final List<T> list = new ArrayList<T>();
        protected final PublishSubject<Notification<T>> onChange = PublishSubject.create();

        public void add(T value) {
            list.add(value);
            onChange.onNext(new Notification<T>(Operation.ADD, value));
        }

        public void remove(T value) {
            list.remove(value);
            onChange.onNext(new Notification<T>(Operation.REMOVE, value));
        }

        public Observable<Notification<T>> getObservable() {
            return onChange;
        }
    }

    public static void main(String[] args) throws Exception {
        ObservableList<Integer> olist = new ObservableList<>();

        olist.getObservable().subscribe(n -> System.out.println("op: " + n.getOperation() + " i: " + n.getItem()));

        olist.add(1);
        Thread.sleep(1000);
        olist.add(2);
        Thread.sleep(1000);
        olist.add(3);
        Thread.sleep(1000);
        olist.remove(2);
    }

    public static enum Operation {
        ADD,
        REMOVE
    }

    @Getter
    @AllArgsConstructor
    public static class Notification<T> {
        private Operation operation;
        private T Item;
    }
}

输出:

op: ADD i: 1
op: ADD i: 2
op: ADD i: 3
op: REMOVE i: 2

关于java - 使用RxJava观察List "add"和 "remove" Action ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59779721/

相关文章:

java - 在类之间传递字符串并跳过输入

java - Hibernate 错误在@PostPersist 方法中保留一个实体

java - Whatsapp 如何快速检测到我使用同一应用程序新添加的号码?

android - 如何从我们的项目中排除 Android Studio 的内部 m2 存储库?

android - 单游标多对多查询不重复数据

java - 删除和收缩 ArrayList

c# - 从列表中选择到多个列表

java - 如何停止 ScheduledExecutorService?

java - 将登录状态存储在 SharedPreference 中

list - OCaml 有像 Haskell 的++ 那样的语法吗?