我有ObservableList<Person>
,Person
有firstName
和lastName
属性(以适当的JavaFX方式),我想要ListView
这将显示人员的名称,并反映列表中的单个Person
对象的列表和属性的更改。这怎么做得最好?有两个问题:
我们需要让ListView
观察两个名称属性,以便刷新更改。 this answer中解释了实现此目的的一种方法(另请参阅this answer)。但是,这个解决方案需要通过&#34;提取器&#34;到ObservableList
的构造函数,我的列表已经存在(作为更大的数据模型的一部分)。有人会认为有一种方法可以包装现有的ObservableList
以添加提取器,但我不会在API中看到它。 (嗯,有this method,但它会将列表视为List
而不是ObservableList
,因此不会报告对原始列表的更新。还this method创建了ObservableList
的&#34; synchronized&#34;包装器,但它没有包含一个提取器参数。)也许我应该只实现一个方法来执行此包装自己?
我们需要在Person
中呈现ListView
项。我知道如何使用自定义ListCell
类来完成此操作,但我希望可能有一种更简单的方法,因为我只显示字符串。依赖Person.toString
不是正确的做法,因为我可能有Person
的其他观点需要Person
到String
的不同转换。有没有办法传递ListView<Person>
一个Callback<Person,String>
(或类似的东西)来将项目转换为字符串?
所以,最后,我确实有办法做我想做的事情:在1中编写我自己的包装器并在2中使用自定义单元工厂。我觉得这需要我做的工作比应该做的更多我认为是一种相对常见的情况。我错过了一种更容易的方法吗?
答案 0 :(得分:0)
Setting Up Google Play Services的评论已经回答了这个问题。
使用提取器创建新的可观察列表,并将内容双向绑定到现有列表。
的内容ListView<Person> listView = new ListView<>();
ObservableList<Person> personList = FXCollections.observableList(person ->
new Observable[] {person.firstNameProperty(), person.lastNameProperty()});
Bindings.bindContentBidirectional(model.getPersonList(), personList);
listView.setItems(personList);