Se barajaron las imágenes al desplazar un ListView con un ViewHolder

Mi problema se conecta cuando el usuario desplaza el ListView. Miré a mi alrededor y vi numerosos ejemplos de "listview imagen perezosa", también ha visto el video de la Google IO que habla de "buenas prácticas" para hacer este trabajo. Pero mi problema continúa cuando el usuario se mueve hacia arriba y hacia abajo el ListView.

Lo que sucede es que cuando se desplaza la lista, las imágenes que se cargaron en cada elemento se barajan y el avatar de cada elemento que va al siguiente elemento termina. No sé si estoy siendo claro, pero voy a mostrar con la imagen.

Al iniciar, los elementos que no tienen imagen izquierda con la imagen estándar.

Imagen 1: http://boxandroid.com/app/weguide/itsok.png Antes de que el usuario desplace ListView: http://boxandroid.com/app/weguide/nook.png

Tenga en cuenta que las imágenes se barajaron entre otros elementos.

En mi adaptador:

public View getView(int position, View convertView, ViewGroup parent){ ViewHolder viewHolder = new ViewHolder(); if(convertView == null){ convertView = _inflate.inflate(R.layout.layout_list, null); viewHolder.text = (TextView) convertView.findViewById(R.id.title); viewHolder.owner = (TextView) convertView.findViewById(R.id.owner); viewHolder.image = (ImageView) convertView.findViewById(R.id.thumb); convertView.setTag(viewHolder); }else{ viewHolder = (ViewHolder) convertView.getTag(); } HashMap<String, String> item = (HashMap<String, String>) getItem(position); viewHolder.text.setText( item.get("poiName").toString() ); viewHolder.owner.setText( item.get("owner").toString() ); ImageView imageView = viewHolder.image; imageView.setTag(item.get("thumbs")); if(!item.get("thumbs").equals("null")){ Drawable cacheImage = loader.loadDrawable(item.get("thumbs"), new ImageManage.ImageCallback() { public void imageLoaded(Drawable imageDrawable, String imageUrl) { ImageView imageViewByTag = (ImageView) _listView.findViewWithTag(imageUrl); if(imageViewByTag != null) imageViewByTag.setBackgroundDrawable(imageDrawable); } }); imageView.setImageDrawable(cacheImage); notifyDataSetChanged(); } return convertView; } 

Utilizado como base el ejemplo en el blog de Android.

http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html

 public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder = new ViewHolder(); if(convertView == null){ convertView = _inflate.inflate(R.layout.layout_list, null); viewHolder.text = (TextView) convertView.findViewById(R.id.title); viewHolder.owner = (TextView) convertView.findViewById(R.id.owner); viewHolder.image = (ImageView) convertView.findViewById(R.id.thumb); convertView.setTag(viewHolder); }else{ viewHolder = (ViewHolder) convertView.getTag(); } HashMap<String, String> item = (HashMap<String, String>) getItem(position); viewHolder.text.setText( item.get("poiName").toString() ); viewHolder.owner.setText( item.get("owner").toString() ); viewHolder.image.setTag(item.get("thumbs")); imageDowload.download(item.get("thumbs"), viewHolder.image); return convertView; } 

Ahora está trabajando, gracias.

Su problema es que usted está colling notifyDataSetChange () dentro del método getView

 if(!item.get("thumbs").equals("null")){ Drawable cacheImage = loader.loadDrawable(item.get("thumbs"), new ImageManage.ImageCallback() { public void imageLoaded(Drawable imageDrawable, String imageUrl) { ImageView imageViewByTag = (ImageView) _listView.findViewWithTag(imageUrl); if(imageViewByTag != null) imageViewByTag.setBackgroundDrawable(imageDrawable); } }); imageView.setImageDrawable(cacheImage); notifyDataSetChanged(); } 

Código anterior debe hacerse fuera del método getView.

  • Detener el desplazamiento del usuario para establecer la posición en RecyclerView
  • Android lista ver espacio extra al final cuando se desplaza
  • Android personalizado listview muy lento al desplazarse
  • Android ListView actual ubicación de desplazamiento Y píxeles
  • Desplazamiento horizontal múltiple de RecyclerView
  • Smooth Scroll para GridView
  • Android :: VideoView dentro de un ScrollView
  • Android ListView alpha scroller para desplazamiento rápido de larga lista
  • ¿Cómo configurar el desplazamiento perfomance para webview?
  • El desplazamiento suave no funciona en ViewPager (biblioteca de soporte)
  • Android WebView dentro de ScrollView solo desplaza scrollview
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.