0

我是 AlertDialogs 的新手,无法让它与光标一起使用。下面的代码在我的 onCreate() 函数中,我知道 Cursor 中有行。我是否缺少创建代码的一部分?

AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);

// set title
alertDialogBuilder.setTitle("Choose a playlist");

// set dialog message
alertDialogBuilder.setCancelable(false);

// Add cursor items
alertDialogBuilder.setCursor(cursor, new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int pos) {
        Toast.makeText(getApplicationContext(), "Clicked on: " + pos, Toast.LENGTH_SHORT).show();
    }
}, MediaStore.Audio.Media.DISPLAY_NAME);

// create alert dialog
AlertDialog alertDialog = alertDialogBuilder.create();

// show it
alertDialog.show();

光标生成器:

private Cursor getPlaylists() {
    String[] ARG_STRING = {
            MediaStore.Audio.Media._ID,
            MediaStore.Audio.Media.DATA,
            MediaStore.Audio.Media.DISPLAY_NAME,
            MediaStore.Audio.Media.IS_MUSIC
    };
    Cursor cursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
                                               ARG_STRING,
                                               null,
                                               null,
                                               null);

    int nameColumn = cursor.getColumnIndex(MediaStore.Audio.Media.IS_NOTIFICATION);
    cursor.moveToFirst();
    for (int i=0; i<5; i++)
        Toast.makeText(getApplicationContext(), "" + cursor.getString(nameColumn), Toast.LENGTH_SHORT).show();
    return cursor;
}
4

3 回答 3

0

你说的对。我的意思是代码如下所示:

AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);

// set title
alertDialogBuilder.setTitle("Choose a playlist");

// set dialog message
alertDialogBuilder.setCancelable(false);

// Add cursor items
alertDialogBuilder.setCursor(cursor, new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int pos) {
        Toast.makeText(getApplicationContext(), "Clicked on: " + pos, Toast.LENGTH_SHORT).show();
    }
}, MediaStore.Audio.Media.DISPLAY_NAME);


// show it
alertDialogBuilder.show();

那应该行得通。如果没有,你能显示你的 logcat 吗?

于 2013-01-28T02:27:44.303 回答
0

在 Cursor Builder 中,您试图获取未查询的列的索引。

int nameColumn = cursor.getColumnIndex(MediaStore.Audio.Media.IS_NOTIFICATION);

您的查询需要四列,其中不包括您尝试访问的 MediaStore.Audio.Media.IS_NOTIFICATION:

String[] ARG_STRING = {
        MediaStore.Audio.Media._ID,
        MediaStore.Audio.Media.DATA,
        MediaStore.Audio.Media.DISPLAY_NAME,
        MediaStore.Audio.Media.IS_MUSIC
};

要解决此问题,只需将 MediaStore.Audio.Media.IS_NOTIFICATION 添加到 ARG_STRING。

于 2013-01-28T03:55:57.650 回答
0

事实证明,以数字开头的字符串会破坏它。改变

MediaStore.Audio.Media.DISPLAY_NAME

"" + MediaStore.Audio.Media.DISPLAY_NAME

修复它。

于 2013-01-28T03:58:48.813 回答