title: JavaFX Listview not updating when giving it an empty ArrayList
body: <p>I'm writing a project in MVC Format and it's supposed to become a music player.</p>
  
  <p>In my View I have the Listview's library and playlist like this:</p>
  
  <pre><code>private ListView&lt;ISong&gt; library = new ListView&lt;ISong&gt;();
  private ListView&lt;ISong&gt; playlist = new ListView&lt;ISong&gt;();
  
  public ListView&lt;ISong&gt; getLibrary() {return library;}
  public ListView&lt;ISong&gt; getPlaylist() {return playlist;}
  
  public View() {
      HBox hBoxCenter = new HBox(library, playlist);
  </code></pre>
  
  <p>We also have the Classes "Playlist" and "Song" which both implement an Interface given to us, and "Playlist" has the following ArrayList, which starts out being completely empty:</p>
  
  <p><div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false">
  <div class="snippet-code">
  <pre class="snippet-code-js lang-js prettyprint-override"><code>package model;
  
  import interfaces.IPlaylist;
  import interfaces.ISong;
  import javafx.collections.ModifiableObservableListBase;
  
  import java.rmi.Remote;
  import java.rmi.RemoteException;
  import java.util.ArrayList;
  import java.util.Iterator;
  
  public class Playlist extends ModifiableObservableListBase&lt;ISong&gt; implements IPlaylist {
      private ArrayList&lt;ISong&gt; songs = new ArrayList&lt;&gt;();
  
      @Override
      public boolean addSong(ISong s) throws RemoteException {
          if (songs.add(s)){
              return true;
          }
          throw new RemoteException("Song could not be added!");
      }
  
      @Override
      public boolean deleteSong(ISong s) throws RemoteException {
          if (songs.contains(s)){
              songs.remove(s);
              return true;
              }
          throw new RemoteException("Song does not exist in this Playlist!");
      }
  
      @Override
      public boolean deleteSongByID(long id) throws RemoteException {
          for (int i = 0; i &lt; songs.size(); i ++){
              if (songs.get(i).getId() == id){
                  songs.remove(i);
                  return true;
              }
          }
          throw new RemoteException("No Song with matching ID exists in Playlist!");
      }
  
      @Override
      public void setList(ArrayList&lt;ISong&gt; s) throws RemoteException {
          if (s != null) {
              songs = s;
              return;
          }
          throw new RemoteException("Playlist can not be null.");
      }
  
      @Override
      public ArrayList&lt;ISong&gt; getList() throws RemoteException {
          try {
              return songs;
          }catch(Exception e){throw new RemoteException();}
      }
  
  
      @Override
      public void clearPlaylist() throws RemoteException {
          try {
              songs.clear();
          }catch(Exception e){throw new RemoteException();}
      }
  
      @Override
      public int sizeOfPlaylist() throws RemoteException {
          try {
              return songs.size();
          }catch(Exception e){throw new RemoteException();}
      }
  
  
      @Override
      public ISong findSongByPath(String name) throws RemoteException {
          for(int i=0; i&lt;songs.size();i++){
              ISong song = songs.get(i);
              if (song.getPath().equals(name)) return song;
          }
          throw new RemoteException("Could not find song with given Path!");
      }
  
      @Override
      public ISong findSongByID(long id) throws RemoteException {
          for(int i=0; i&lt;songs.size();i++){
              ISong song = songs.get(i);
              if (song.getId()==id) return song;
          }
          throw new RemoteException("Could not find song with given ID!");
      }
  
      @Override
      public Iterator&lt;ISong&gt; iterator() {
          return null;
      }
  
      @Override
      public ISong get(int index) {
          return songs.get(index);
      }
  
      @Override
      public int size() {
          return songs.size();
      }
  
      @Override
      protected void doAdd(int index, ISong element) {
          songs.add(index, element);
      }
  
      @Override
      protected ISong doSet(int index, ISong element) {
          return null;
      }
  
      @Override
      protected ISong doRemove(int index) {
          return null;
      }
  }</code></pre>
  </div>
  </div>
  </p>
  
  <p>In my Controller I link them like this:</p>
  
  <pre><code>public void link (Model model, View view){
      this.view = view;
      this.model = model;
      view.getLibrary().setItems(model.getLibrary());
      view.getPlaylist().setItems(model.getPlaylist());
  }
  </code></pre>
  
  <p>The MainClass looks as follows:</p>
  
  <pre><code>public void start(Stage primaryStage) throws Exception {
  
      Model model = new Model();
      View view = new View();
      Controller controller = new Controller();
  
      controller.link(model,view);
      view.setController(controller);
      controller.initializePlaylist();
  
      Scene scene = new Scene(view);
      primaryStage.setScene(scene);
      primaryStage.show();
      controller.cleanup();
  
  }
  </code></pre>
  
  <p><strong>Now here comes my Problem:</strong>
  When the GUI opens and the ArrayList is empty, it won't show any further changes made to the ArrayList. HOWEVER, if I add an "empty" Song into my ArrayList and then simply clear the list after the GUI is open, everything works just fine (This is exactly the reason why I wrote the initializePlaylist and the cleanup methods).</p>
  
  <p>Sorry if this is a stupid question or if I didn't provide enough code snippets, I'm just really out of ideas at this point and I've been searching for the cause of this for hours.</p>