2013-07-04 51 views
0

嗨,我需要在列表视图中显示音乐文件的数组,当我点击那个音乐文件,我需要播放该歌曲,我试图使用下面的代码来显示歌曲在列表视图,但它显示空指针异常在加入阵列的TextView线,但相同的代码列表视图中显示图像,在那里我没有弄错的任何一个工作建议我..如何在列表视图中显示音乐文件android

public class CustomListViewExample extends Activity { 
    Integer[] text; 
    public static ArrayList<Integer> list1 = new ArrayList<Integer>(); 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.citylist); 
     list1.add(R.raw.apple); 
     list1.add(R.raw.intro_letter_report_card); 
     list1.add(R.raw.intro_title_page_1); 

     text = list1.toArray(new Integer[list1.size()]); 

     ListView l1 = (ListView) findViewById(R.id.ListView01); 
     l1.setAdapter(new MyCustomAdapter(text)); 
    } 

    class MyCustomAdapter extends BaseAdapter { 
     Integer[] data_image; 

     MyCustomAdapter() { 
      data_image = null; 
     } 

     MyCustomAdapter(Integer[] text) { 
      data_image = text; 
     } 

     @Override 
     public int getCount() { 
      return data_image.length; 
     } 

     @Override 
     public String getItem(int position) { 
      return null; 
     } 

     @Override 
     public long getItemId(int position) { 
      return position; 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      LayoutInflater inflater = getLayoutInflater(); 
      View row; 

      row = inflater.inflate(R.layout.city_row_item, parent, false); 

      TextView t1=(TextView)row.findViewById(R.id.textView1); 

      t1.setText(""+data_image[position]); 
      return (row); 
     } 
    } 
} 
+0

请妥善格式化你的代码。非常难以通过 – Raghunandan

+0

你能分享logcat的NPE吗? – sandrstar

+0

关于播放音乐并显示它,您可以参考我的测试项目https://github.com/AlexStarc/MM5。 – sandrstar

回答

0

对于NPE,似乎没有textView1查看R.layout.city_row_item

关于显示音乐文件列表并播放它们,您可以参考this exemple

另外,我相信你需要参考this video from 2010 IO为ListViews创建更好的适配器(因为在你的代码中你不使用convertView项目)。

+0

是的,你的正确我给了错误的ID..thnaks – user2401554

0

用声音池的声音第一次加载到内存中。这是我正在做我的应用程序Beat Shaker

// Sound pool new instance 
spool = new SoundPool(3, AudioManager.STREAM_MUSIC, 0); 
// Sound pool on load complete listener 
spool.setOnLoadCompleteListener(new OnLoadCompleteListener() { 
    @Override 
    public void onLoadComplete(SoundPool soundPool, int sampleId, int status) { 
     Log.i("OnLoadCompleteListener","Sound "+sampleId+" loaded."); 
     loaded = true; 
    } 
});  
// Load the sample IDs 
soundId = new int[3]; 
soundId[0] = spool.load(this, R.raw.clave, 1); 
soundId[1] = spool.load(this, R.raw.maracas, 1); 
soundId[2] = spool.load(this, R.raw.crash, 1); 

然后你就可以从运行一个类似的功能,相应的列表选择侦听器调用线程:

public void Sound1(){ 
    AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE); 
    float volume = (float) audioManager.getStreamVolume(AudioManager.STREAM_MUSIC); 
    int streamID = -1; 
    do{ 
     streamID = spool.play(soundId[0], volume, volume, 1, 0, 1f); 
    } while(streamID==0); 
}; 
3

使用下面的代码在它的任何一个显示ListView和点击音频文件,播放这首歌

public class AudioListActivity extends Activity { 
ListView musiclist; 
Cursor musiccursor; 
int music_column_index; 
int count; 
MediaPlayer mMediaPlayer; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.audiolist_activity); 
    init_phone_music_grid(); 
} 
private void init_phone_music_grid() { 
    System.gc(); 
    String[] proj = { MediaStore.Audio.Media._ID,MediaStore.Audio.Media.DATA, 
         MediaStore.Audio.Media.DISPLAY_NAME,MediaStore.Video.Media.SIZE }; 

    musiccursor = managedQuery(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,proj, null, null, null); 

    count = musiccursor.getCount(); 
    musiclist = (ListView) findViewById(R.id.PhoneMusicList); 
    musiclist.setAdapter(new MusicAdapter(getApplicationContext())); 

    musiclist.setOnItemClickListener(musicgridlistener); 
    mMediaPlayer = new MediaPlayer(); 
} 

private OnItemClickListener musicgridlistener = new OnItemClickListener() { 
    public void onItemClick(AdapterView parent, View v, int position,long id) { 
     System.gc(); 
     music_column_index = musiccursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA); 
     musiccursor.moveToPosition(position); 
     String filename = musiccursor.getString(music_column_index); 

     try { 
      if (mMediaPlayer.isPlaying()) { 
       mMediaPlayer.reset(); 
      } 
      mMediaPlayer.setDataSource(filename); 
      mMediaPlayer.prepare(); 
      mMediaPlayer.start(); 
     } catch (Exception e) { 

     } 
    } 
}; 

public class MusicAdapter extends BaseAdapter { 
    private Context mContext; 

    public MusicAdapter(Context c) { 
     mContext = c; 
    } 

    public int getCount() { 
     return count; 
    } 

    public Object getItem(int position) { 
     return position; 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     System.gc(); 
     TextView tv = new TextView(mContext.getApplicationContext()); 
     String id = null; 
     if (convertView == null) { 
      music_column_index = musiccursor 
        .getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME); 
      musiccursor.moveToPosition(position); 
      id = musiccursor.getString(music_column_index); 
      music_column_index = musiccursor 
        .getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE); 
      musiccursor.moveToPosition(position); 
      id += " Size(KB):" + musiccursor.getString(music_column_index); 
      tv.setText(id); 
     } else 
      tv = (TextView) convertView; 
     return tv; 
    } 
} 
@Override 
public void onBackPressed() { 
    // TODO Auto-generated method stub 
    super.onBackPressed(); 
    mMediaPlayer.stop(); 
} 
} 
+0

谢谢你的答复我有解决方案..我在我的代码中犯了一个小错误 – user2401554

相关问题