如何从Android中的SQLite数据库传入文件名?

时间:2015-03-16 08:46:04

标签: android database sqlite expandablelistview

我无法找到解决问题的方法。我有一个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;
            }
        });

1 个答案:

答案 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等)。