0

私は Android 2.1 用のシンプルな音楽アプリを書いていますが、そのような問題に遭遇しました:

私のアクティビティには、アルバム カバー、アルバム タイトル、アーティスト、および各行の曲数を含む ListView があります。これらすべての値を ContentProvider にクエリして、ListView に入れます。しかし、SDCARD の一部のアルバムにはアルバム カバーがなく、クエリは NULL を返すと思います。その結果、私の ListView には、カバーのあるアルバムがほとんどありません。

私がやりたいことは、クエリが null カバーを返す場合に、ContentProvider をクエリするとき、または他の場所に引数を入れて、既定のアイコンをアルバム カバーとして配置することです。つまり、ContentProvider がカバーとして何も返さない場合、デフォルトのアイコンをこの場所に配置したいと考えています。

ManagedCursor ではなく、他のクエリを使用する必要がありますか?

IFNULL 句 (SELECT IFNULL(title, "------") AS title FROM books;) を使用して、同様のデータベースの問題に対する解決策を見ました。何らかの形で役立つと思ったのですが、ContentProvider クエリにそのような句を入れる場所がありません。

誰もそれを行う方法を知っていますか? 以下にmuコードを入れます:

private void getAllAlbumsFromSDCARD() 
{
    String[] cols = { MediaStore.Audio.Albums.ALBUM, MediaStore.Audio.Albums.ALBUM_ART, MediaStore.Audio.Media.ARTIST, 
            MediaStore.Audio.Media._ID, MediaStore.Audio.Albums.NUMBER_OF_SONGS};        
    Uri allAlbumsUri = MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI;
    albumsCursor = this.managedQuery(allAlbumsUri, cols, null, null, MediaStore.Audio.Media.ALBUM);
    // SELECT IFNULL(title, "------") AS title FROM books;
    Log.d(TAG, "" +albumsCursor.getCount());

    if(albumsCursor!=null)
    {
        Log.d(TAG, "Managing cursor");
        startManagingCursor(albumsCursor);

        //  
        String[] from = new String[] { MediaStore.Audio.Albums.ALBUM_ART, MediaStore.Audio.Albums.ALBUM, MediaStore.Audio.Media.ARTIST, 
                MediaStore.Audio.Albums.NUMBER_OF_SONGS };
        int[] to = new int[] { R.id.cover, R.id.album, R.id.artist, R.id.count };

        ListAdapter albums = new SimpleCursorAdapter(this, R.layout.album_row, albumsCursor, from, to);
        this.setListAdapter(albums);
    }
}
4

1 に答える 1

0

私の問題の解決策は、カスタム CursorAdapter であることがわかりました。私が望んでいたものを正確に作成するコードを貼り付けます。

public class MyCursorAdapter extends SimpleCursorAdapter{

private MainActivity mainActivity;
private int layout;

public MyCursorAdapter(MainActivity context, int layout, Cursor c, String[] from, int[] to) {
    super(context, layout, c, from, to);
    this.mainActivity = context;
    this.layout = layout;
}

public View getView(int position, View convertView, ViewGroup parent) {

     // Cursor to current item 
    Cursor cursor = getCursor();
    cursor.moveToPosition(position);

    View v = mainActivity.getLayoutInflater().inflate(layout, parent, false); 

    TextView albumTV = (TextView) v.findViewById(R.id.album); 
    if (albumTV != null) 
    { 
            int index = cursor.getColumnIndex(MediaStore.Audio.Albums.ALBUM); 
            String album = cursor.getString(index); 
            albumTV.setText(album); 
    } 

    TextView artistTV = (TextView)v.findViewById(R.id.artist); 
    if (artistTV != null) 
    { 
            int index = cursor.getColumnIndex(MediaStore.Audio.Albums.ARTIST); 
            String artist = cursor.getString(index); 
            artistTV.setText(artist); 
    } 

    TextView countTV = (TextView)v.findViewById(R.id.count); 
    if (countTV != null) 
    { 
            int index = cursor.getColumnIndex(MediaStore.Audio.Albums.NUMBER_OF_SONGS); 
            String count = cursor.getString(index); 
            countTV.setText(count); 
    }

    ImageView cover = (ImageView) v.findViewById(R.id.cover); 
    if (cover != null) 
    { 
            int index = cursor.getColumnIndex(MediaStore.Audio.Albums.ALBUM_ART);
            String path = cursor.getString(index); 
            Log.d("MCA", ""+path);

            if(path == null)
            {
                cover.setImageResource(R.drawable.no_cover_64);
                cover.setScaleType(ImageView.ScaleType.FIT_CENTER);
            }
            else 
            {
                BitmapDrawable icon = new BitmapDrawable(path);
                cover.setImageDrawable(icon);
            }
    } 
    return v; 
}

}

于 2012-07-14T21:32:09.853 に答える