CursorLoader专辑艺术和歌曲标题成单个光标

时间:2014-11-05 10:44:13

标签: android android-cursoradapter mediastore android-cursorloader

我正在使用mediastore内容提供商使用listview中的cursoradapter在我的设备上显示有关音乐的信息。我正在尝试将我的列表中显示的艺术家姓名,歌曲名称和album_art显示为购买我无法将此信息整合到mediastore.audio.albums.albumart和mediastore.audio.media中的一个游标中。我可以得到一个或者另一个显示得很好,但由于cursoradapter只处理一个游标,我需要找到一种方法从mediastore一次查询所有信息。

我已经搜索了这个问题的适当解决方案已经很久了,但我还没有能够得到任何工作。我能找到的最相关的例子(基于此尝试)是here。显然,我并不完全理解cursorloader构造函数的语法。我在其他地方读过帖子,建议使用cursorwrapper或joincursor来获得理想的结果。但是我很难过。如果有人能指出我正确的方向,我将非常感激。这就是我现在所拥有的:

public class Playlist extends Activity {
    private static final int CAFLAGS = 1;
    private int listlayout = R.layout.playlist;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(listlayout);
        Context context = this.getApplicationContext();
        String[] projection = {
                MediaStore.Audio.Media._ID,
                "Title",
                "Artist",
                "Album",
                "AlbumArt"

        };
        String selection = "Title="+MediaStore.Audio.Media.TITLE
                +", Artist="+MediaStore.Audio.Media.ARTIST
                +", Album="+MediaStore.Audio.Media.ALBUM
                +", AlbumArt="+MediaStore.Audio.Albums.ALBUM_ART;
        Uri queryUri = MediaStore.Files.getContentUri("external");
        CursorLoader cursorloader = new CursorLoader(
                this,
                queryUri,
                projection,
                selection,
                null,
                "Title DESC"
        );
        Cursor cursor = cursorloader.loadInBackground();
        TextView test = (TextView)findViewById(R.id.test);
        test.setText(String.valueOf(cursor.getCount()));
        ListView listview = (ListView)findViewById(android.R.id.list);
        PlaylistAdapter adapter = new PlaylistAdapter(context,cursor,CAFLAGS);
        listview.setAdapter(adapter);
    }
}

我的播放列表适配器:

public class PlaylistAdapter extends CursorAdapter {
    private LayoutInflater inflater;
    public PlaylistAdapter(Context context, Cursor cursor, int flags) {
        super(context, cursor, flags);
    }
    @Override
    public void bindView(View view, Context context, Cursor cursor) {

        TextView nameview = (TextView) view.findViewById(R.id.songname);
        TextView artistview = (TextView) view.findViewById(R.id.artistname);
        ImageView albumart = (ImageView)view.findViewById(R.id.albumcover);
        String coverpath = cursor.getString(cursor.getColumnIndex("AlbumArt"));
        String name = cursor.getString(cursor.getColumnIndex("Title"));
        String artist = cursor.getString(cursor.getColumnIndex("Artist"));
        Bitmap art = BitmapFactory.decodeFile(coverpath);
        nameview.setText(name);
        artistview.setText(artist);
        albumart.setImageBitmap(art);


    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        return inflater.from(context).inflate(R.layout.playlist_row, parent, false);
    }
}

好吧所以我认为这是一些神秘的过程,但它与任何其他SQL查询完全一样。选择列将有用,选择某些数据并将其放入我的光标。似乎这是不可能的原因是因为album_art所在的表和歌曲标题的表是不同的,似乎无法使用一个查询访问它们。所以我想解决方案是使用curserjoin或将我想要的值从单独的表写入我自己的SQLite数据库或矩阵游标。从长远来看,第二种选择会更有用。我已经搜索过,但是找不到任何这样的例子,可能是使用do..while(cursor.hasnext)迭代它,然后在已经有正确列名的数据库中添加一行。

如何遍历游标的每一行中的列并将值分配给我定义的数据库?

0 个答案:

没有答案