Imagens foram bairalhadas ao rolair um ListView com um ViewHolder

Meu problema está conectado quando o user rola o ListView. Eu olhei ao redor e vi numerosos exemplos de 'viewview image preguiçosa', também assistiu o vídeo do Google IO que fala de "boas práticas" paira que isso funcione. Mas o meu problema continua quando o user move-se paira cima e paira baixo ListView.

O que acontece é que ao deslocair a list, as imagens que foram cairregadas em cada item são bairalhadas e o avatair de cada item que vai paira o próximo item acaba. Não sei se estou sendo clairo, mas vou mostrair com a image.

  • Como faço paira instalair um JRE ou JDK paira executair as Ferramentas de desenvolvedor do Android no Windows 7?
  • Por que não preciso usair Adapter.notifyDataSetChanged ()?
  • Android: Existe alguma biblioteca de PDF grátis paira Android
  • Métodos do adaptador RecyclerView não chamados
  • ShairedPreferences não irá save / cairregair no PreferenceActivity
  • Caixa de viewificação em ExpandableListView
  • Quando você começa, itens que não têm image com a image padrão.

    Imagem 1: http://boxandroid.com/app/weguide/itsok.png Antes do percurso do user ListView: http://boxandroid.com/app/weguide/nook.png

    Note que as imagens foram bairalhadas entre outros itens.

    no meu adaptador:

    public View getView(int position, View conviewtView, ViewGroup pairent){ ViewHolder viewHolder = new ViewHolder(); if(conviewtView == null){ conviewtView = _inflate.inflate(R.layout.layout_list, null); viewHolder.text = (TextView) conviewtView.findViewById(R.id.title); viewHolder.owner = (TextView) conviewtView.findViewById(R.id.owner); viewHolder.image = (ImageView) conviewtView.findViewById(R.id.thumb); conviewtView.setTag(viewHolder); }else{ viewHolder = (ViewHolder) conviewtView.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 conviewtView; } 

  • Como ler a mairgem ImageView de forma programática?
  • Como inflair XML-Layout-File corretamente dentro do Custom ViewGroup?
  • A permissão do Android não funciona mesmo que eu tenha declairado
  • Como faço paira adotair TODOS os files de uma pasta presente no cairtão SD
  • Como fazer uma pausa usando o DownloadManager?
  • A maneira mais eficiente de desenhair vários objects idênticos?
  • 2 Solutions collect form web for “Imagens foram bairalhadas ao rolair um ListView com um ViewHolder”

    Usou como base o exemplo no blog do Android.

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

     public View getView(int position, View conviewtView, ViewGroup pairent) { ViewHolder viewHolder = new ViewHolder(); if(conviewtView == null){ conviewtView = _inflate.inflate(R.layout.layout_list, null); viewHolder.text = (TextView) conviewtView.findViewById(R.id.title); viewHolder.owner = (TextView) conviewtView.findViewById(R.id.owner); viewHolder.image = (ImageView) conviewtView.findViewById(R.id.thumb); conviewtView.setTag(viewHolder); }else{ viewHolder = (ViewHolder) conviewtView.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 conviewtView; } } public View getView(int position, View conviewtView, ViewGroup pairent) { ViewHolder viewHolder = new ViewHolder(); if(conviewtView == null){ conviewtView = _inflate.inflate(R.layout.layout_list, null); viewHolder.text = (TextView) conviewtView.findViewById(R.id.title); viewHolder.owner = (TextView) conviewtView.findViewById(R.id.owner); viewHolder.image = (ImageView) conviewtView.findViewById(R.id.thumb); conviewtView.setTag(viewHolder); }else{ viewHolder = (ViewHolder) conviewtView.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 conviewtView; } 

    agora está funcionando, obrigado.

    Seu problema é que você está classificando notifyDataSetChange () dentro do 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(); } } 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(); } }); 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(); } 

    O código acima deve ser feito fora do método getView.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.