Tengo la siguiente pantalla que contiene algunas imágenes (6 por visible de la página). El desplazamiento hacia arriba y hacia abajo parece bastante lag a mí. Es como que la representación de las imágenes de nuevo. El desplazamiento de vuelta hasta parece peor que el desplazamiento hacia abajo.

Alguien sabe cómo aumentar el rendimiento en un área para crear un buen desplazamiento suave?

Actualización: las imágenes y El texto es todo recuperado de mi base de datos SQLite. La lista se crea con SimpleCursorAdapter.

Desplazamiento a través de ListView con algunas imágenes muy lag

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;
}
}
  • Me ayudaría mucho si pudieras publicar el código de su método getView que crea el único de los elementos de la lista.
  • Yo no uso getView. Yo uso SimpleCursorAdapter para crear este punto de vista.
  • Puede usted publicar la creación de la SimpleCursorAdapter y si se extiende el cursor del adaptador de la bindView método?
  • He publicado el SimpleCursorAdapter clase.
InformationsquelleAutor mlevit | 2010-09-06

3 Comentarios

  1. 6

    El problema es que cada imagen es decodificado por el momento la vista está preparado para mostrar. El control ListView se recicle sus puntos de vista que significa que en el momento de una vista sale de la pantalla va a ser reutilizado y por lo tanto la imagen se sobrescribirán y la recolección. Si el elemento vuelve a entrar en la pantalla de la imagen tiene que ser decodificado a partir de la base de datos de nuevo.

    La decodificación es razonable rápido, pero si el usuario cambia la posición en la lista muy rápidamente toda la decodificación de las llamadas de hacer su lista de muy lag.

    Me gustaría implment algo así como un ImageCache. Una clase que contiene un Mapa con WeakReferences a las imágenes. Cada vez que usted desea mostrar una imagen que le eches un vistazo si la imagen está ya en el mapa y si el WeakReference todavía apunta a un objeto, si este no es el caso, usted necesita para decodificar la imagen y, a continuación, guárdelo en el mapa.

    Echar un vistazo a la carga diferida preguntas, estas le mostrará cómo poner la decodificación en una tarea en segundo plano y, a continuación, actualizar la lista en el momento en que las imágenes se cargan. Es un poco más de esfuerzo, pero se puede hacer la lista mucho más rápido. Si usted va a utilizar el código de ejemplo de la carga diferida preguntas intentar utilizar AsyncTasks en lugar de Hilos para hacer la decodificación en.

    • Usted está en lo correcto. Cada vez que me iba a desplazarse hacia atrás en vista de que iba a recuperar la imagen de la DB, decodificar y mostrar. ¿Tienes algún ejemplo donde se utilizan AsyncTasks para la decodificación en lugar de Hilos?
  2. 0

    Si las imágenes no son del tamaño adecuado, que se están incrementando en la marcha, que no es una operación barata, especialmente para imágenes de gran tamaño. Asegúrese de que se están cargando las miniaturas, no el fondo de pantalla, fuera de su base de datos.

    También, usted puede utilizar Traceview a encontrar en su tiempo se gasta.

    • Estoy usando miniaturas, pero no el tamaño exacto que usted ve allí… así que cambia de tamaño hacia abajo. ¿Crees que sería mejor para almacenar una segunda aún más pequeña miniatura que sólo serán utilizados para la lista? Yo uso el original de la imagen en miniatura para visualizar un AlertDialog con él en el interior una vez que usted haga clic en el elemento de la lista (por lo que necesito la mayor miniatura).
    • Vale la pena intentarlo, o el uso Traceview a ver si el tiempo parece ser gastado en el código de cambio de tamaño. También es concebible que la carga de blob de SQLite es inusualmente lenta-nunca he imágenes almacenadas en una tabla y así no tener ninguna idea de las características de rendimiento.

Dejar respuesta

Please enter your comment!
Please enter your name here