gpt4 book ai didi

java - 编辑 ObservableList 中的多个元素,仅在最后一次更改后触发更改监听器

转载 作者:行者123 更新时间:2023-11-29 08:20:27 25 4
gpt4 key购买 nike

我有一个 ObservableList,它不仅在添加或删除元素时触发注册的 ListChangeListeners,而且在这些元素中的特定 Observable 属性发生更改时触发,例如一个人的列表,当一个人的地址发生变化时,ListChangeListeners 会触发。我怎样才能编辑多人的地址,并让监听器对所有更改一起只触发一次?

最佳答案

ObservableList 默认不提供这个功能。如果扩展 ModifiableObservableList不过,您可以使其 beginChange()endChange() 功能可供外部代码访问。

虽然正确使用了这个类,但您需要小心。如果您不执行相同数量的 beginChangeendChange 调用,监听器可能根本不会收到任何更新。

以下代码不包含任何关于更新更改的实现。我会把这个留给你。您需要在调用 beginChangeendChange 之间使用 nextUpdate。如果您想要提取器功能,您可能需要向 doXyz 方法添加额外的功能以添加监听器。

public class BulkEditObservableList<T> extends ModifiableObservableListBase<T> {

private final List<T> backingList;

public BulkEditObservableList(List<T> backingList) {
if (backingList == null) {
throw new IllegalArgumentException();
}
this.backingList = backingList;
}

public BulkEditObservableList() {
this(new ArrayList<>());
}

@Override
public T get(int index) {
return backingList.get(index);
}

@Override
public int size() {
return backingList.size();
}

@Override
protected void doAdd(int index, T element) {
backingList.add(index, element);

}

@Override
protected T doSet(int index, T element) {
return backingList.set(index, element);
}

@Override
protected T doRemove(int index) {
return backingList.remove(index);
}

public void beginBulkChange() {
beginChange();
}

public void endBulkChange() {
endChange();
}

}

使用示例

BulkEditObservableList<Integer> intList = new BulkEditObservableList<>();
intList.addListener((Observable o) -> System.out.println(o));
intList.add(1);

intList.beginBulkChange();
intList.add(2);
intList.add(3);
intList.add(0, 0);
System.out.println("after multi add");
intList.endBulkChange();

输出

[1]
after multi add
[0, 1, 2, 3]

关于java - 编辑 ObservableList 中的多个元素,仅在最后一次更改后触发更改监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59324227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com