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) 
相关问题