Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/222.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用游标载入器获取特定专辑的歌曲?_Java_Android_Android Cursorloader - Fatal编程技术网

Java 如何使用游标载入器获取特定专辑的歌曲?

Java 如何使用游标载入器获取特定专辑的歌曲?,java,android,android-cursorloader,Java,Android,Android Cursorloader,我正在尝试用android中的游标载入器创建一个基本的音乐播放器。 其想法是让活动具有两个列表视图,一个显示相册,另一个显示特定选定相册的歌曲 以下是我主要活动的代码: public class AlbumCursorLoader extends Activity implements LoaderCallbacks<Cursor> { private static final int LOADER_ALBUM_ID = 1; private static final int LOA

我正在尝试用android中的游标载入器创建一个基本的音乐播放器。 其想法是让活动具有两个列表视图,一个显示相册,另一个显示特定选定相册的歌曲

以下是我主要活动的代码:

public class AlbumCursorLoader extends Activity implements LoaderCallbacks<Cursor> {
private static final int LOADER_ALBUM_ID = 1;
private static final int LOADER_SONGS_ID = 2;

AlbumsAdapter mAdapter;
AlbumSongsAdapter mSongsAdapter;

CursorLoader AlbumCursor;
CursorLoader SongsCursor;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_album_cursorloader);

    mAdapter = new AlbumsAdapter(this, null);
    mSongsAdapter = new AlbumSongsAdapter(this,null);

    ListView AlbumList = (ListView) findViewById(R.id.listviewid_albumart);
    ListView SongsList = (ListView) findViewById(R.id.listviewid_albumsongs);
    AlbumList.setAdapter(mAdapter);
    SongsList.setAdapter(mSongsAdapter);

    getLoaderManager().initLoader(LOADER_ALBUM_ID, null, this);
    getLoaderManager().initLoader(LOADER_SONGS_ID, null, this);

    AlbumList.setOnItemClickListener(new OnItemClickListener(){
        public void onItemClick(AdapterView<?> parent, View v, int position,long id) {
            //Have to display the songs on clicking the album list.
        }
    });
}

public Loader<Cursor> onCreateLoader(int id, Bundle args) {      
    String select = null;

    switch(id){
    case LOADER_ALBUM_ID:
        String[] mProjection =
        {
                MediaStore.Audio.Albums._ID,
                MediaStore.Audio.Albums.ALBUM_ART,
                MediaStore.Audio.Albums.ALBUM_KEY
        };
        AlbumCursor = new CursorLoader(this, MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,mProjection, select, null, null);
        return AlbumCursor;
    case LOADER_SONGS_ID:
        String[] mProjection1 =
        {
              MediaStore.Audio.Media.DATA,
              MediaStore.Audio.Media._ID,
              MediaStore.Audio.Media.TITLE,
              MediaStore.Audio.Media.DISPLAY_NAME,
              MediaStore.Audio.Media.MIME_TYPE,
        };
        SongsCursor = new CursorLoader(this, MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,mProjection1, select, null, null);
        return SongsCursor;
    default:
        return null;
    }
}  

public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    switch (loader.getId()){
    case LOADER_ALBUM_ID:
        mAdapter.swapCursor(data);
    break;
    case LOADER_SONGS_ID:
        mSongsAdapter.swapCursor(data);
    break;
    }
}  

public void onLoaderReset(Loader<Cursor> loader) {
    switch (loader.getId()){
    case LOADER_ALBUM_ID: 
        mAdapter.swapCursor(null);  
    break;
    case LOADER_SONGS_ID: 
        mSongsAdapter.swapCursor(null);  
    break;
    }
}  

}
现在我的疑问是,当我点击某张专辑时,如何获得该专辑的歌曲? 我知道如何通过硬编码专辑名称来查询特定专辑中的歌曲,但如何在单击特定专辑时获取专辑歌曲?它应该是动态的

我尝试了另一种方法,使用普通光标(不带光标加载程序),将光标设置到特定的位置光标;在OnlistItem中,单击ListActivity

     protected void onListItemClick(ListView l, View v, int position, long id) {
        if (cursor.moveToPosition(position)) {

          String[] columns = { MediaStore.Audio.Media.DATA,
              MediaStore.Audio.Media._ID,
              MediaStore.Audio.Media.TITLE,
              MediaStore.Audio.Media.DISPLAY_NAME,
              MediaStore.Audio.Media.MIME_TYPE, };

          String where = android.provider.MediaStore.Audio.Media.ALBUM
              + "=?";

          String whereVal[] = { cursor.getString(cursor
              .getColumnIndex(MediaStore.Audio.Albums.ALBUM)) };

          String orderBy = android.provider.MediaStore.Audio.Media.TITLE;

          cursor = managedQuery(
              MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, columns,
              where, whereVal, orderBy);

          String[] displayFields = new String[] { MediaStore.Audio.Media.DISPLAY_NAME };
          int[] displayViews = new int[] { android.R.id.text1 };
          setListAdapter(new SimpleCursorAdapter(this,
              android.R.layout.simple_list_item_1, cursor,
              displayFields, displayViews));

        }
      }
类似地,将游标装入器的游标设置到数据库中的特定位置的方法是什么? 我想对游标装入器使用类似的逻辑。 请帮我解决这个问题。 如果需要进一步澄清,请告知我

     protected void onListItemClick(ListView l, View v, int position, long id) {
        if (cursor.moveToPosition(position)) {

          String[] columns = { MediaStore.Audio.Media.DATA,
              MediaStore.Audio.Media._ID,
              MediaStore.Audio.Media.TITLE,
              MediaStore.Audio.Media.DISPLAY_NAME,
              MediaStore.Audio.Media.MIME_TYPE, };

          String where = android.provider.MediaStore.Audio.Media.ALBUM
              + "=?";

          String whereVal[] = { cursor.getString(cursor
              .getColumnIndex(MediaStore.Audio.Albums.ALBUM)) };

          String orderBy = android.provider.MediaStore.Audio.Media.TITLE;

          cursor = managedQuery(
              MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, columns,
              where, whereVal, orderBy);

          String[] displayFields = new String[] { MediaStore.Audio.Media.DISPLAY_NAME };
          int[] displayViews = new int[] { android.R.id.text1 };
          setListAdapter(new SimpleCursorAdapter(this,
              android.R.layout.simple_list_item_1, cursor,
              displayFields, displayViews));

        }
      }