1

我試圖提取一種方法,將歌曲信息返回給一個新類,以便我可以從多個類中調用它的實例。Java Android:如何提取上下文作爲參數的方法

的方法:

public int getSongList(ContentResolver resolver){ 
     //retrieve song info 
     ContentResolver musicResolver = resolver; 
     Uri musicUri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
     Cursor musicCursor = musicResolver.query(musicUri, null, null, null, null); 

     if(musicCursor!=null && musicCursor.moveToFirst()){ 
      //get columns 
      int titleColumn = musicCursor.getColumnIndex 
        (android.provider.MediaStore.Audio.Media.TITLE); 
      int idColumn = musicCursor.getColumnIndex 
        (android.provider.MediaStore.Audio.Media._ID); 
      int artistColumn = musicCursor.getColumnIndex 
        (android.provider.MediaStore.Audio.Media.ARTIST); 
      //add songs to list 
      do { 
       long thisId   = musicCursor.getLong(idColumn); 
       String thisTitle = musicCursor.getString(titleColumn); 
       String thisArtist = musicCursor.getString(artistColumn); 
       songList.add(new Song(thisId, thisTitle, thisArtist)); 
      } 
      while (musicCursor.moveToNext()); 
     } 
     return 0; 
    } 

假設上述方法被放置在MainActivity。下面是我試圖從一個片段實例化它。

@Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
           Bundle savedInstanceState) { 
      super.onCreateView(inflater,container,savedInstanceState); 

      View rootView = inflater.inflate(R.layout.library_songs, container, false); 

      this.mView  = rootView; 

      songView = (ListView) mView.findViewById(R.id.song_list); 
      songList = new ArrayList<Song>(); 
      new MainActivity().getSongList(mView.getContext().getContentResolver()) 

      Collections.sort(songList, new Comparator<Song>(){ 
       public int compare(Song a, Song b){ 
       return a.getTitle().compareTo(b.getTitle()); 
      } 
      }); 

      SongAdapter songAdt = new SongAdapter(mView.getContext(), songList); 
      songView.setAdapter(songAdt); 

      return rootView; 
     } 

錯誤:

顯示java.lang.NullPointerException:嘗試在上一個空對象引用 調用虛擬方法 '布爾java.util.ArrayList.add(java.lang.Object中)' com.auxiline.audioscope.MainActivity.getSongList(MainActivity.java:219)

回答

0

調用

new MainActivity().getSongList(mView.getContext().getContentResolver()) 

,因爲您正在創建MainActivity的新對象,並且在該對象中,songList對象爲null。 另外,您似乎在MainActivity中有兩份songList,另一份在片段中,因此您必須決定使用哪一個。 解決這個你可以通過在MainActivity的目的是片段的片段構造:

public MyFragment(MainActivity activity,...){ .... } 

所以當你在MainActivity創建片段對象使用:

MyFragment mMyFragment = new MyFragment(MainActivity.this , ...); 

還你重寫getSongList方法以使其使用片段中的歌曲列表對象:

public int getSongList(ContentResolver resolver,ArrayList<Song> songList) 
相關問題