JavaFX ListView重复删除错误

时间:2016-03-31 03:54:17

标签: listview javafx observable observablelist

link to imgur

@FXML
ListView queueList;

ObservableList<QueueSong> SongQueueObservableList;


queueList.setCellFactory(new Callback<ListView<QueueSong>,ListCell<QueueSong>>() {
    @Override
    public ListCell<QueueSong> call(ListView<QueueSong> myObjectListView) {
        ListCell<QueueSong> cell = new ListCell<QueueSong>(){
            @Override
            protected void updateItem(QueueSong myObject, boolean b) {
                super.updateItem(myObject, b);
                if(myObject != null) {
                    setText(myObject.getSong());
                }
            }
        };
        return cell;
    }
});

queueList.setItems(SongQueueObservableList);

SongQueueObservableList.add(new QueueSong("song 1", "artist 1"));
SongQueueObservableList.add(new QueueSong("song 2", "artist 2"));
SongQueueObservableList.add(new QueueSong("song 3", "artist 3"));
SongQueueObservableList.add(new QueueSong("song 4", "artist 4"));

我尝试过以下删除

的实现
Platform.runLater( () -> {
       // queueList.getItems().remove(0);
        SongQueueObservableList.remove(0);
    });

第一次复制后的行不可选。并且只有从列表中删除所有值后,ListView才会更新为空列表。

如果有人对如何解决这个问题有任何提示,我会很感激。

当我使用调试器时,ObservableListListView都具有预期值。我想真正的问题是,为什么只有在移除所有对象时,ListView才会自行清除?

1 个答案:

答案 0 :(得分:3)

问题是您使用的单元类。它只设置文本,但从不清除它。由于单元格可能变空,您需要解决此问题:

new ListCell<QueueSong>(){
    @Override
    protected void updateItem(QueueSong myObject, boolean empty) {
        super.updateItem(myObject, empty);
        // set text to song or clear (= set to null)
        setText((empty || myObject == null) ? null : myObject.getSong());
    }
}