我正在使用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)迭代它,然后在已经有正确列名的数据库中添加一行。
如何遍历游标的每一行中的列并将值分配给我定义的数据库?