Le défilement à travers ListView avec quelques images très lag
J'ai l'écran ci-dessous qui contient certaines images (6 par page visible). Faire défiler vers le haut et vers le bas semble assez lag pour moi. C'est comme il est rendu à nouveau les images. Défiler jusqu'semble pire que le défilement vers le bas.
Ce que quelqu'un sait comment augmenter les performances dans une zone pour créer un joli bon de défilement?
Mise à jour: Les images et tout le texte est extrait de ma base de données SQLite. La liste est créée à l'aide de SimpleCursorAdapter.
private class HistoryViewBinder implements SimpleCursorAdapter.ViewBinder
{
//private int wallpaperNumberIndex;
private int timeIndex;
private int categoryIndex;
private int imageIndex;
private java.text.DateFormat dateFormat;
private java.text.DateFormat timeFormat;
private Date d = new Date();
public HistoryViewBinder(Context context, Cursor cursor)
{
dateFormat = android.text.format.DateFormat.getDateFormat(context);
timeFormat = android.text.format.DateFormat.getTimeFormat(context);
//wallpaperNumberIndex = cursor.getColumnIndexOrThrow(HistoryDatabase.KEY_WALLPAPER_NUMBER);
timeIndex = cursor.getColumnIndexOrThrow(HistoryDatabase.KEY_TIME);
categoryIndex = cursor.getColumnIndexOrThrow(HistoryDatabase.KEY_CATEGORY);
imageIndex = cursor.getColumnIndexOrThrow(HistoryDatabase.KEY_IMAGE);
}
@Override
public boolean setViewValue(View view, Cursor cursor, int columnIndex)
{
Log.d(TAG, "setViewValue");
if (view instanceof TextView)
{
Log.d(TAG, "TextView");
TextView tv = (TextView) view;
if (columnIndex == timeIndex)
{
Log.d(TAG, "timeIndex");
d.setTime(cursor.getLong(columnIndex));
tv.setText(timeFormat.format(d) + " " + dateFormat.format(d));
return true;
}
else if (columnIndex == categoryIndex)
{
Log.d(TAG, "categoryIndex");
tv.setText(cursor.getString(columnIndex));
return true;
}
}
else if (view instanceof ImageView)
{
Log.d(TAG, "ImageView");
ImageView iv = (ImageView) view;
if (columnIndex == imageIndex)
{
Log.d(TAG, "imageIndex");
byte[] image = cursor.getBlob(columnIndex);
Bitmap bitmapImage = BitmapFactory.decodeByteArray(image, 0, image.length);
iv.setImageBitmap(bitmapImage);
return true;
}
}
return false;
}
}
Je m'aiderait beaucoup si vous pouviez poster le code de votre méthode getView qui crée la liste unique des éléments.
Je n'utilise pas getView. J'utilise SimpleCursorAdapter pour créer ce point de vue.
Pouvez-vous puis après la création de la SimpleCursorAdapter et si vous étendez le curseur de l'adaptateur de la bindView méthode?
J'ai posté le SimpleCursorAdapter classe.
Je n'utilise pas getView. J'utilise SimpleCursorAdapter pour créer ce point de vue.
Pouvez-vous puis après la création de la SimpleCursorAdapter et si vous étendez le curseur de l'adaptateur de la bindView méthode?
J'ai posté le SimpleCursorAdapter classe.
OriginalL'auteur mlevit | 2010-09-06
Vous devez vous connecter pour publier un commentaire.
Le problème est que chaque image est décodée à l'instant où la vue est préparée pour montrer. Le contrôle ListView recycler vos points de vue qui signifie que, au moment d'une vue sur les feuilles de l'écran, il sera réutilisé et, par conséquent, l'image sera écrasé et les ordures collectées. Si l'élément dans l'écran de l'image doit être décodé à partir de la base de données à nouveau.
Le décodage est raisonnable vite, mais si l'utilisateur modifie la position dans la liste très rapidement tous le décodage des appels fera de votre liste de lag.
Je implment quelque chose comme un ImageCache. Une classe qui contient une Carte avec WeakReferences aux images. Chaque fois que vous voulez afficher une image, vous prenez un coup d'oeil si l'image est déjà dans la carte et si le WeakReference encore des points à un objet, si ce n'est pas le cas, vous avez besoin pour décoder l'image, puis de les stocker dans la carte.
Prendre un coup d'oeil au chargement différé des questions, ces va vous montrer comment mettre le décodage en tâche de fond et ensuite mettre à jour la liste du moment où les images sont chargées. Il est un peu plus d'effort, mais il peut faire la liste de beaucoup de beaucoup plus rapide. Si vous allez utiliser l'exemple de code dans le chargement différé des questions essayez d'utiliser AsyncTasks au lieu de Threads pour faire le décodage.
OriginalL'auteur Janusz
Ici est qqch, ce que vous devriez lire, et il devrait vous aider à résoudre le problème (ensemble de l'Affichage des images Efficacement la partie):
http://developer.android.com/training/displaying-bitmaps/process-bitmap.html
OriginalL'auteur Krystian
Si vos images ne sont pas à la bonne taille, ils sont en train d'être mis à l'échelle à la volée, ce qui n'est pas une opération pas cher, en particulier pour les grandes images. Assurez-vous que vous êtes le chargement des vignettes, pas le fond d'écran de votre base de données.
Aussi, vous pouvez utiliser Traceview pour savoir où votre temps est dépensé.
Il vaut la peine d'essayer, ou de l'utilisation Traceview pour voir si votre temps semble s'être passé dans le redimensionnement de code. Il est également concevable que le chargement des gouttes de SQLite est anormalement lent -- je n'ai jamais d'images stockées dans un tableau et donc n'ont aucune idée des caractéristiques de performance.
OriginalL'auteur CommonsWare