C
ChemDroid
Gast
Hallo zusammen,
meine App beinhaltet eine ListActivity, die aus Elementen besteht, die wiederum 3 TextViews beinhalten für Interpret, Titel und Album, sowie eine ImageView zur Darstellung eines Albumarts.
Die Liste ist quasi so aufgebaut wie die Tracklist in der Standard Musik App.
Die Daten werden aus MediaStore per Cursor abgefragt und der Cursor mit einem modifizierten SimpleCursorAdapter an die ListView gebunden.
Hier ist der Code:
imageCache ist eine HashMap<String, Bitmap> und dient als Cache für die Albumarts, die schon über decodeFile bearbeitet wurden, sodass sie nicht immer wieder neu decodiert werden müssen.
In einer vorherigen Version des Codes fehlte dieser imageCache nocht, d.h. das Bild wurde jedes mal aus der Datei selbst decodiert. Das machte sich vor allem dadurch bemerkbar, dass die ListView beim scrollen extrem ruckelte.
Nach Hinzufügen des imageCache ruckelt die ListView zwar nicht mehr so stark wie vorher, aber ein merkliches ruckeln ist dennoch sichtbar.
Wenn ich die Tracklist in der Musik App anschaue fällt mir auf, dass sie eigentlich gar nicht ruckelt.
Hat jemand von euch eine Idee wie ich den Code, bzw. das ganze Vorhaben noch weiter optimieren kann?
Vielen Dank
meine App beinhaltet eine ListActivity, die aus Elementen besteht, die wiederum 3 TextViews beinhalten für Interpret, Titel und Album, sowie eine ImageView zur Darstellung eines Albumarts.
Die Liste ist quasi so aufgebaut wie die Tracklist in der Standard Musik App.
Die Daten werden aus MediaStore per Cursor abgefragt und der Cursor mit einem modifizierten SimpleCursorAdapter an die ListView gebunden.
Hier ist der Code:
Code:
void setListAdapterOverride() {
String[] fromColumns = new String[] {
AudioColumns.ARTIST,
MediaColumns.TITLE,
AudioColumns.ALBUM,
AudioColumns.ALBUM_ID
};
int[] toColumns = new int[] {
R.id.tv_artist,
R.id.tv_title,
R.id.tv_album,
R.id.iv_albumArt
};
cursorAdapter = new customAdapter(getBaseContext(), R.layout.listviewitem, cursor, fromColumns, toColumns);
setListAdapter(cursorAdapter);
if (MyDebug.Log)
Log.d("Activity", "ListAdapter gesetzt");
}
class customAdapter extends SimpleCursorAdapter {
int layout;
Cursor cursor;
String[] from;
int[] to;
public customAdapter(Context context, int layout, Cursor c,
String[] from, int[] to) {
super(context, layout, c, from, to);
this.layout = layout;
this.cursor = c;
this.from = from;
this.to = to;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
if (row == null) {
LayoutInflater inflater = getLayoutInflater();
row = inflater.inflate(R.layout.listviewitem, parent, false);
if (MyDebug.Log)
Log.d("Activity", "Inflate");
}
cursor.moveToPosition(position);
TextView artist = (TextView) row.findViewById(to[0]);
TextView title = (TextView) row.findViewById(to[1]);
TextView album = (TextView) row.findViewById(to[2]);
ImageView albumArt = (ImageView) row.findViewById(to[3]);
artist.setText(cursor.getString(cursor.getColumnIndex(from[0])));
title.setText(cursor.getString(cursor.getColumnIndex(from[1])));
album.setText(cursor.getString(cursor.getColumnIndex(from[2])));
Cursor albumArtCursor = contentResolver.query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, new String[] { MediaStore.Audio.Albums._ID, MediaStore.Audio.Albums.ALBUM_ART }, MediaStore.Audio.Albums._ID + "='" + cursor.getInt(cursor.getColumnIndex(from[3])) + "'", null, null);
albumArtCursor.moveToFirst();
String albumArtUri = albumArtCursor.getString(albumArtCursor.getColumnIndex(MediaStore.Audio.Albums.ALBUM_ART));
if (albumArtUri == null) albumArtUri = "default";
if (!imageCache.containsKey(albumArtUri)) {
Bitmap albumArtBitmap;
if (!albumArtUri.equals("default")) {
Options opts = new Options();
opts.inJustDecodeBounds = true;
BitmapFactory.decodeFile(albumArtUri, opts);
Integer[] bitmapSize = new Integer[] { opts.outWidth, opts.outHeight };
Integer scaleFactor = 1;
while ((bitmapSize[0]/2 > 50) && (bitmapSize[1]/2 > 50)) {
scaleFactor++;
bitmapSize[0] /= 2;
bitmapSize[1] /= 2;
}
opts = new Options();
opts.inSampleSize = scaleFactor;
albumArtBitmap = BitmapFactory.decodeFile(albumArtUri, opts);
} else {
albumArtBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_mp_song_list);
}
imageCache.put(albumArtUri, albumArtBitmap);
}
albumArt.setImageBitmap(imageCache.get(albumArtUri));
return row;
}
}
In einer vorherigen Version des Codes fehlte dieser imageCache nocht, d.h. das Bild wurde jedes mal aus der Datei selbst decodiert. Das machte sich vor allem dadurch bemerkbar, dass die ListView beim scrollen extrem ruckelte.
Nach Hinzufügen des imageCache ruckelt die ListView zwar nicht mehr so stark wie vorher, aber ein merkliches ruckeln ist dennoch sichtbar.
Wenn ich die Tracklist in der Musik App anschaue fällt mir auf, dass sie eigentlich gar nicht ruckelt.
Hat jemand von euch eine Idee wie ich den Code, bzw. das ganze Vorhaben noch weiter optimieren kann?
Vielen Dank