有没有办法投ArrayList来ObservableList?我想不经过迭代就这样做ArrayList.
更具体地说,我使用ORMLite从数据库中获取数据,我需要ObservableList作为从DB获取数据的方法的输出.
目前我正在做这样的事情:
ArrayList<Stavka> listStavaka = new ArrayList<>();
Dao<Stavka, Integer> stavkaDao = DaoManager.createDao(connection, Stavka.class);
listStavaka = (ArrayList<Stavka>) stavkaDao.queryForAll();
ObservableList<Stavka> oListStavaka = FXCollections.observableArrayList();
for (Stavka stavka : listStavaka) {
oListStavaka.add(stavka);
}
Run Code Online (Sandbox Code Playgroud)
我想做这样的事情:
ObservableList<Stavka> listStavaka = FXCollections.observableArrayList();
Dao<Stavka, Integer> stavkaDao = DaoManager.createDao(connection, Stavka.class);
listStavaka = (ObservableList<Stavka>) stavkaDao.queryForAll();
Run Code Online (Sandbox Code Playgroud) 我发现很难发现android.databinding.ObservableList作为数据绑定功能的真正存在理由.
起初它看起来像一个很酷的工具来显示列表,通过数据绑定,将它们添加xml到一个RecyclerView.为此,我制作了一个像这样的BindingAdapter:
@BindingAdapter(value = {"items"}, requireAll = false)
public static void setMyAdapterItems(RecyclerView view, ObservableList <T> items) {
if(items != null && (view.getAdapter() instanceof MyAdapter)) {
((GenericAdapter<T>) view.getAdapter()).setItems(items);
}
}
Run Code Online (Sandbox Code Playgroud)
这样一来,我可以使用该属性app:items的RecyclerView一个MyAdapter集来,以更新其项目.
现在最好的功能ObservableList是你可以添加一个OnListChangedCallback,它可以处理RecyclerView添加/移动/删除/更改项目中可用的相同事件,而无需实际重新加载整个列表.
所以我想要实现的逻辑是以下:
MyAdapterObservableArrayList包装它们并将它传递给bindingBindingAdapter传递的项目MyAdapterMyAdapter接收到新的项目,它会清除其旧的并添加OnListChangedCallback到ObservableList接收处理微变ObservableList,MyAdapter将相应更改而不会完全刷新binding变量,这样BindingAdapter …android observablelist android-recyclerview android-databinding android-binding-adapter
在某些情况下,有必要检测 - 在ListChangeListener中,无需控制列表本身 - "所有数据被换出",当我们需要清除某些状态时选择 - 在全新数据上,旧状态毫无意义.
可以通过以下方式获得完整的新数据
考虑可以在setAll上触发哪种类型的更改(c是更改,items是观察到的列表,"subChangeCount"用于计算子更改的伪代码):
// initially empty
assertEquals(0, items.size());
items.setAll(1, 2, 4);
assertEquals(1, c.subChangeCount());
assertTrue(c.wasAdded() && !c.wasReplaced());
assertEquals(0, c.getFrom());
assertEquals(c.getList().size(), c.getAddedSize());
// initially not empty
assertTrue(items.size() > 0);
items.setAll(1, 2, 4);
assertEquals(1, c.subChangeCount());
assertTrue(c.wasReplaced());
assertEquals(0, c.getFrom());
assertEquals(c.getList().size(), c.getAddedSize());
Run Code Online (Sandbox Code Playgroud)
这似乎允许实用程序检查,如:
boolean wasSetOrClearedAll(Change c) {
if (c.getList().isEmpty()) return true;
c.next();
if (c.getAddedSize() == c.getList().size()) return true;
return false;
}
Run Code Online (Sandbox Code Playgroud)
相比之下,内部fx代码,在收听ComboBox的项目时:
while (c.next()) {
comboBox.wasSetAllCalled = comboBox.previousItemCount == c.getRemovedSize();
...
}
comboBox.previousItemCount = getItemCount();
Run Code Online (Sandbox Code Playgroud)
存储旧的itemCount并将其与当前的removedSize进行比较(我感到很不舒服,旧状态经常因我的口味而变得陈旧),但是我很有可能在我的方法中遗漏了一些东西.
问题是: …
从ObservableLista 中删除项目时,将触发更改事件,其中getFrom()提供删除的位置并getRemoved()提供已删除的项目列表.文件说:
该
getRemoved()方法返回已从列表中替换或删除的元素列表.
它没有这样说,但我暗示项目列表是原始列表中的连续子列表.我已经用这个假设编写了很多代码,但是现在我TreeTableView的选择模型遇到了困难,而这种模式并没有这样做.
以一个带有三个"Node"行的简单树表为例.如果我选择那三行......
...然后单击并选择中间行...
...触发的更改事件treeTableView.getSelectionModel().getSelectedItems()如下所示:
{ [TreeItem [ value: Node 1 ], TreeItem [ value: Node 3 ]] removed at 0, }
Run Code Online (Sandbox Code Playgroud)
在单个更改事件中,它报告从selectedItems列表的索引0中删除了"节点1"和"节点3" .
我原以为该Change对象有两个由next()调用分隔的独立删除事件.第一次调用next()将告诉我"节点1"在索引0处被删除,第二次调用next()将告诉我"节点3"在索引1处被删除.但是不,我得到一个单独的事件,其中两行都列在一旦.
getRemoved()真的可以退回不连续的物品吗?这是我对列表更改事件如何工作的误解,还是一个错误TreeTableView?
通常我会犹豫是否会责怪标准库,但这不是我在JavaFX中发现的第一个错误,所以这不是不可想象的.
如果我添加一个调用setShowRoot(false),行为会发生变化.我得到了我所期望的,删除分为两部分:
{ [TreeItem [ value: Node 1 ]] removed at 0, [TreeItem [ …Run Code Online (Sandbox Code Playgroud) 我正在尝试研究JavaFX,因为我想将它用作我程序的GUI.我的问题基本上是一个概念问题:
到目前为止,我的程序主要是MVC模式的"模型"部分; 也就是说,我的几乎所有代码都是类的意义上的抽象的OO表示,所有代码都是逻辑代码.
由于我不想成为我的程序的唯一用户,我想添加MVC的"视图"部分,以便人们可以轻松地使用和操作我的程序的"模型"部分.为此,我想使用JavaFX.
在我的"Model"类中,我显然使用了Java Collections API中的各种Lists,Maps和其他类.为了让我的程序的用户操作这些底层列表和地图,我想在JavaFX中使用Observable(List/Map)接口.
澄清情况的具体例子:
假设我有一个MachineMonitor类,每3分钟检查一次机器的某些属性,例如连接是否仍然良好,齿轮转动的速度等等.如果满足某些不等式(比如说速度)齿轮下降到1转/秒的速度)MachineMonitor触发RestartMachineEvent.
目前我使用ArrayList < MachineMonitor >来跟踪所有单独的MachineMonitor.现在扩展到MVC的"视图"部分,我希望用户能够操作显示MachineMonitor列表的TableView,以便他们可以创建和删除新的MachineMonitor来监视各种机器.
这样我就可以跟踪我的程序用户想要做什么(比如,为机器#5 创建一个MachineMonitor,检查齿轮的转/秒是否低于0.5)我使用ObservableList < MachineMonitor > TableView的基础列表.
链接程序的"模型"和"视图"的最简单方法就是将"模型"类更改为具有ObservableList < MachineMonitor >而不是ArrayList < MachineMonitor >但是(转到问题主题)我觉得这非常混乱,因为它混合了"模型"和"查看"代码.
一种天真的方法是对TableView 使用ObservableList < MachineMonitor >并保留我的ArrayList < MachineMonitor >的使用.但是,根据JavaFX规范,对ObservableList < MachineMonitor >所做的更改不会影响基础List.
鉴于此,是为了解决这一难题,以便为ObservableList一个ChangeListener的最佳方式< MachineMonitor >该"传播"到ObservableList <所做的更改MachineMonitor >到底层"模型"的ArrayList < MachineMonitor >?也许把它放在一个名为MachineMonitorController的类中?
这种临时解决方案看起来非常混乱且非理想.
我的问题是:在这种情况下,保持"模型"和"视图"之间几乎完全分离的最佳方法是什么?
我有一个TableView,我想绑定a的禁用属性Button与ObservableList表的模型的大小.特别是,我想在ObservableList大于2 的大小时禁用按钮.
我怎样才能做到这一点?
在我使用的表中没有选择任何行时禁用另一个按钮
editRoadButton.disableProperty().bind(roadsTable.getSelectionModel().selectedItemProperty().isNull());
Run Code Online (Sandbox Code Playgroud)
有类似的方法吗?
我有一个MasterData,它是一个ObservableList和filteredData,它也是一个ObservableList.
然后,我想用它来设置过滤器时显示过滤后的数据,但也可以在必要时恢复,这里是MCVE:
package br;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
public class Main{
private static ObservableList<Foo> masterData = FXCollections.observableArrayList();
private static ObservableList<Foo> filteredData = FXCollections.observableArrayList();
static Filter filter = new Filter();
public static void addDummy(){
masterData.add(new Foo("a",1));
masterData.add(new Foo("aa",3));
masterData.add(new Foo("b",2));
masterData.add(new Foo("bb",4));
masterData.add(new Foo("c",3));
}
public static void printData(ObservableList<Foo> list){
for(Foo f: list) System.out.println(f.getName());
}
public static void main(String[] args) {
addDummy();
applyFilter(3);
printData(filteredData);
applyFilter(0);
printData(filteredData);
}
public static void applyFilter(int num){
filter.setData(masterData);
filter.setFilter(num);
filteredData …Run Code Online (Sandbox Code Playgroud) 收藏家有可能给我一个ObservableArrayList吗?有点像这样:
ObservableList<String> newList = list.stream().
filter(x -> x.startsWith("a").
collect(Collectors.toCollection(ObservableArrayList::new));
Run Code Online (Sandbox Code Playgroud) 为什么JavaFX中没有ObservableQueue?如果我们查看FXCollections的Java 9文档(只是为了查看是否有任何更改),我们会看到静态帮助器方法来创建Observable集,列表和映射.还有一些方法可以创建Observable浮点数和整数数组.但是,无法创建ObservableQueue.Java中的Queue接口有许多有趣的实现,包括ArrayDeque,DelayQueue,ConcurrentLinkedQueue,PriorityQueue等.为什么不支持在JavaFX中创建ObservableQueues的原因是什么.
有没有一种方法可以通过它们之间的元素转换来绑定两个可观察列表的内容?例如,这样的事情:
ObservableList<Model> models = FXCollections.observableArrayList();
ObservableList<TreeItem<Model>> treeItemModels = FXCollections.observableArrayList();
Bindings.bindContent(treeItemModels, models, m -> new TreeItem<Model>(m));
Run Code Online (Sandbox Code Playgroud)