0

こんにちは、リストビューに音楽ファイルの配列を表示する必要があります。その音楽ファイルをクリックすると、その曲を再生する必要があります。以下のコードを使用してリストビューに曲を表示しようとしましたが、テキストビュー行に配列を追加する際に null ポインター例外が表示されますが、リストビューに画像を表示するために機能する同じコード。

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);
        }
    }
}
4

3 に答える 3

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();
}
}
于 2013-07-04T05:57:13.227 に答える
0

NPE の場合、 にtextView1ビューがないようR.layout.city_row_itemです。

音楽ファイルの一覧表示と再生については、こちらの例を参考にしてください

また、 ListViews 用のより優れたアダプターを作成するには、2010 IO のこのビデオを参照する必要があると思います (コードでは convertView アイテムを使用していないため)。

于 2013-07-04T05:41:37.423 に答える
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);
};
于 2013-07-04T05:36:24.303 に答える