2010-10-08 18 views
6

que utilizo este código en mi getView:imagen incorrecto aparece en mis filas ListView

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View v = convertView; 
    if (v == null) { 

     LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v = vi.inflate(R.layout.listrow, null); 
    } 
    Order o = items.get(position); 

    if (o != null) { 
     TextView tt = (TextView) v.findViewById(R.id.toptext); 
     ImageView thumb = (ImageView) v.findViewById(R.id.icon); 

     if (o.getOrderDrawable() != null) { 
      thumb.setImageDrawable(o.getOrderDrawable()); 
     } else { 
      tt.setText(o.getOrderTitle()); 
     } 

    } 
    return v; 
} 

El problema es cuando se desplaza; a veces se muestra la imagen correcta, pero a veces al desplazarse hacia atrás/adelante, las imágenes se muestran de forma aleatoria y no están asociadas a la fila.

Las imágenes se descargan de la web.

¿Cómo debo resolver este problema?

Respuesta

24

ListView de Android reutiliza los elementos de la lista cuando ya no los necesitan. Por esta razón, debe asegurarse de que todas las vistas que deberían cambiar se cambien.

Su problema es que si no encuentra un dibujable para el elemento de la lista actual, no vaciar ni esconder el ImageView. Debe hacer thumb.setImageDrawable(null) en ese caso, o thumb.setVisibility(View.GONE).

+0

¡Gracias, eso lo resolvió! El problema era que algunas de mis imágenes habían desaparecido en el servidor web. Gracias por esto. – Curtain

+0

cuando quiero mostrar imágenes de marcador de posición mientras las imágenes son tomadas de internet. ¿Como podría hacerlo? ¿Y qué operación es la cara la vi.inflate (R.layout.listrow, null)? – Karussell

+0

Gracias de antemano – Mojiiz

-1

Si deja de usar el convertView que obtiene (lo cual es absolutamente necesario), y genera una vista completamente nueva para devolver cada vez, ¿funciona correctamente? Creo que el problema está en la forma en que reutilizas las vistas.

+1

no se detienen reutilización de vistas. Tienes que reutilizar las vistas correctas, pero definitivamente debes reutilizarlas. – Janusz

+0

Lo que dijo Janusz. Trate de crear una lista con algunas docenas de elementos y revísela (o, lo que es peor, desplácese rápidamente). Sin reutilizar vistas, el rendimiento será horrible. – benvd

-1

He intentado utilizar la solución marcada aquí como correcta, pero no resuelve el problema de una imagen incorrecta durante el desplazamiento. Intenté el segundo (Zsombor Erdődy-Nagy) y ahora está realmente bien. Así que gracias Zsombor :-)

Aquí es mi fragmento:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    /* 
    View v = convertView; 
    if (v == null) { 
     LayoutInflater vi = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v = vi.inflate(R.layout.tweet_list, null); 
    } 
    */ 
    LayoutInflater vi = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View v = vi.inflate(R.layout.tweet_list, null); 
    final Status status = getItem(position); 
    if (status != null) { 
     TextView statusName = (TextView) v.findViewById(R.id.statusName); 
     TextView statusText = (TextView) v.findViewById(R.id.statusText); 
     TextView statusWhen = (TextView) v.findViewById(R.id.statusWhen); 
     TextView statusScreenName = (TextView) v.findViewById(R.id.statusScreenName); 
     final ImageView statusUserImage = (ImageView) v.findViewById(R.id.statusUserImage); 
     statusName.setText(status.getUser().getName()); 
     statusScreenName.setText("@" + status.getUser().getScreenName()); 
     statusText.setText(status.getText()); 
     statusWhen.setText(dateTimeFormatter.format(status.getCreatedAt())); 
     URL url = status.getUser().getProfileImageURL(); 
     String imageCacheKey = url.getPath(); 
     Drawable cachedImage = imageCache.get(imageCacheKey); 
     if (null != cachedImage) { 
      statusUserImage.setImageDrawable(cachedImage); 
     } else { 
      new DownloadImageTask(statusUserImage, imageCacheKey).execute(url); 
     } 

    } 
    return v; 
} 
+0

Hola Alex, estaba teniendo la misma experiencia que tú, pero luego me di cuenta de que necesito establecer la visibilidad (View.GONE) para CADA vista (todas las vistas de texto e imágenes). Una vez que hice eso, pude reutilizar el convertView. Creo que es mejor, probablemente más eficiente para reutilizar cuando sea posible. – wuliwong

+0

Esto definitivamente no es el camino a seguir. Cada vez que se necesita mostrar un nuevo elemento de la lista, lo está creando completamente desde cero. Los diseños de Inflayout son una operación muy costosa. Debes reutilizar ConvertView. Estoy seguro de que funciona, pero no de manera eficiente. Si vuelve a utilizar ConvertView y aún tiene imágenes incorrectas, es porque no está configurando correctamente todas las vistas en su elemento de la lista. – benvd

Cuestiones relacionadas