我有一个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);
FXCollections.observableArrayList
"创建一个新的可观察列表,其中包含添加到其中的项目" - 即它是一个使用您传入的数据初始化的可观察列表。因此,对原始列表的更改不会反映在其创建的新列表中。
您需要FXCollections.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);