Изображения были перетасованы при прокрутке ListView с помощью ViewHolder

Моя проблема связана, когда пользователь прокручивает ListView. Я огляделся и увидел многочисленные примеры «ленивого образа списка», также просмотрел видеоролик о Google IO, в котором говорится о «хорошей практике», чтобы сделать эту работу. Но моя проблема продолжается, когда пользователь перемещается вверх и вниз по ListView.

Случается, что при прокрутке списка изображения, загруженные на каждый элемент, перетасовываются, и аватар каждого элемента, идущего на следующий элемент, заканчивается. Я не знаю, ясно ли я, но я покажу с изображением.

Когда вы начинаете, элементы, которые не имеют изображения, остаются со стандартным изображением.

Изображение 1: http://boxandroid.com/app/weguide/itsok.png Перед прокруткой списка пользователей ListView: http://boxandroid.com/app/weguide/nook.png

Обратите внимание, что изображения были перетасованы между другими элементами.

В моем адаптере:

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; } 

Solutions Collecting From Web of "Изображения были перетасованы при прокрутке ListView с помощью ViewHolder"

Используется в качестве базового примера в блоге 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; } 

Теперь работает, спасибо.

Ваша проблема в том, что вы вызываете notifyDataSetChange () внутри метода 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(); } 

Код выше должен быть выполнен вне метода getView.