2016-02-12 173 views
0

我有TableViewPagination。像這樣(簡化):JavaFX TableView分頁 - 不更新TableView更新ObservableList數據

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); 
} 

的問題是,當我做一個更新dataObservableList)。該更改在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); 

回答

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); 
+0

Tnx for answer,但這仍然不能解決問題。 – Virtap

+0

您是否可以更新問題以顯示如何更新數據? –

+0

我已更新我的問題。 – Virtap