我有TableView
Pagination
。像这样(简化):
public void createPagination() {
Pagination pagination = new Pagination((allDataCount / rowsPerPage) + 1, 0);
pagination.setPageFactory(this::createPage);
}
private Node createPage(int pageIndex) {
int fromIndex = pageIndex * rowsPerPage;
int toIndex = Math.min(fromIndex + rowsPerPage, allDataCount);
table.setItems(FXCollections.observableArrayList(data.subList(fromIndex, toIndex)));
return new BorderPane(table);
}
问题是,当我对data
(ObservableList
)进行更新时。 TableView
中无法看到此更改。
我认为,问题出在data.subList
。如果我使用table.setItems(data)
设置项目,则所有更改都会立即显示在TableView
。
任何想法,我怎么能解决这个问题?
的修改
我正在更新这样的数据:
//prepare new/changed Test object
Test test = new Test();
test.setId(1000);
int selectedIndex = table.getSelectionModel().getSelectedIndex() + pageIndex * rowsPerPage;
data.set(selectedIndex, test);
答案 0 :(得分:2)
FXCollections.observableArrayList
“创建一个新的可观察列表,其中添加了项目” - 即它是一个可观察的列表,使用您传入的数据进行初始化。因此,对原始列表的更改将不会被反映出来在它创建的新列表中。
您需要FXCollections.observableList(...)
,其中“构造由原始列表支持的ObservableList” - 即对基础列表的更改将反映在新列表中,反之亦然。
所以你想要
table.setItems(FXCollections.observableList(data.subList(fromIndex, toIndex)));
现在,表格显示的列表只是整个data
列表的一部分视图。因此table.getItems()
对data
的更改将显示,反之亦然。但是,表格视图仅观察table.getItems()
,即使data
是可观察列表,data
的更改通知也不会传递给table.getItems()
。因此,您需要更改表正在观察的列表:
int selectedIndex = table.getSelectionModel().getSelectedIndex() ;
table.getItems().set(selectedIndex, test);