我无法找到解决问题的方法。我有一个ExpandableListView,在单击子视图时创建一个新的MediaPlayer实例。目前,这是通过我的原始文件夹中的文件的硬编码链接完成的,但我想将其切换为从数据库中获取文件名,然后使用该文件名从原始文件夹加载相应的音频文件。 / p>
我的数据库设置如下:
_id|English|Hanzi|Pinyin|Filename
1 |Hello! |你好 |nǐ hǎo|hello
光标已加载并填充ExpandableListView。如何使用数据库中的文件名加载这个mediaPlayer实例,以便每个孩子都加载自己的音频文件?
//load cursor
public void fillData() {
Cursor mGroupsCursor = mydb.fetchColorsGroup();
startManagingCursor(mGroupsCursor);
mGroupsCursor.moveToFirst();
//Basic ExpandableListView Adapter
MyExpandableListAdapter mAdapter = new MyExpandableListAdapter(mGroupsCursor, this,
R.layout.group_item, // Group layout
R.layout.child_item, // Child layout
new String[]{"English"}, // Group fields
new int[]{R.id.english_text}, // Widget ids for group data
new String[]{"Hanzi", "Pinyin"}, // Child fields
new int[]{R.id.foreign_text, R.id.romanization}); // Widget ids for child data
final ExpandableListView elv = (ExpandableListView) this.findViewById(R.id.shell_expList);
elv.setAdapter(mAdapter); // Set the list adapter
// Set the listener for child clicks
elv.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent, View v,
int groupPosition, int childPosition, long id) {
// Stop the media player
if (mediaPlayer != null) {
mediaPlayer.release();
}
// Start the media player
mediaPlayer = MediaPlayer.create(getApplicationContext(), R.raw.shi);
mediaPlayer.start();
return true;
}
});
答案 0 :(得分:0)
使用一个MediaPlayer实例!不要为每一行重新创建一个。您可以使用其reset()和方法传递新数据源。要在适配器的getView / bindView(对于行)中传递此新数据源,可以在视图上使用setTag()方法。为了避免产生歧义,请在res / ids.xml中添加一个id(如果你不想创建另一个资源文件,你也可以在res / styles.xml中添加它),然后执行以下操作:
public void bindView(View view, Context context, Cursor cursor) {
...
// some method retrieving the song path from the cursor such as
String uriLiteral = cursor.getString(COLUMN_INDEX_SONG_URI);
// then you can do
view.setTag(R.id.view_tag_song_play_path, uriLiteral);
return mView;
}
在点击监听器中:
@Override
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
String uriLiteral = (String) v.getTag(R.id.view_tag_song_uri);
if (uriLiteral != null) {
mediaPlayer.stop();
mediaPlayer.reset();
mediaPlayer.setDataPath(uriLiteral);
mediaPlayer.prepare(); // .start();
}
}
*代码按原样:mediaPlayer可能具有除setDataPath之外的其他内容,具体取决于您用于引用音乐文件的句柄类型(例如,磁盘路径,资产ID等)。