从javafx中的ObservableList删除

时间:2018-12-23 14:27:15

标签: javafx observablelist

我有两个ObservableList,其中一个包含一些歌曲,另一个包含与歌曲相关的目录。

我想从其ObservableList中删除目录时,所有包含该目录的歌曲都将从其ObservableList中删除。 但是当我这样做时,只会删除具有奇数id的歌曲,而保留具有偶数id的歌曲!!!

我的ObservableLists在不同的类中,而“ controller”是包含ObservableLists的类的对象。 这是我的代码:

private static ObservableList<SongModel> songModelObservableList = FXCollections.observableArrayList();
private static ObservableList<Directory_Model> directoryModelObservableList = FXCollections.observableArrayList();

现在是删除目录的代码:

for (int j = 0 ; j < controller.getSongModelObservableList().size() ; j++)
   if (controller.getSongModelObservableList().get(j).getPath().contains(controller.getDirectoryModelObservableList().get(i).getPath())){
         controller.getSongModelObservableList().remove(controller.getSongModelObservableList().get(j));

          }
    controller.getDirectoryModelObservableList().remove(controller.getDirectoryModelObservableList().get(i));

在这里。在第一种情况下,我检查哪个songModel(我的歌曲类)具有目录的路径将其从songObservableList中删除。

有什么办法解决?我想删除所有目录歌曲,而不是具有奇数id的歌曲。

1 个答案:

答案 0 :(得分:0)

如果从列表中删除索引为j的元素,则修改后位置为j的元素是先前索引为j+1的元素。由于在循环的每次迭代之后都增加索引,因此,如果在迭代中删除了一项,则可以跳过一项。如果没有删除任何项目,则仅增加索引:

final String removePath = controller.getDirectoryModelObservableList().get(i).getPath();
for (int j = 0; j < controller.getSongModelObservableList().size();)
   if (controller.getSongModelObservableList().get(j).getPath().contains(removePath)){
       controller.getSongModelObservableList().remove(j);
   } else {
       j++;
   }
}
controller.getDirectoryModelObservableList().remove(i);

虽然简单地将PredicateremoveIf一起使用会更简单:

final String removePath = controller.getDirectoryModelObservableList().get(i).getPath();
controller.getSongModelObservableList().removeIf(element -> element.getPath().contains(removePath));