Изображения были перемешаны при прокрутке ListView с помощью ViewHolder - PullRequest
8 голосов
/ 12 апреля 2011

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

Ответы [ 2 ]

3 голосов
/ 19 апреля 2011

Использован в качестве базы пример на блоге Android.

http://android -developers.blogspot.com / 2010/07 / многопоточность-для-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;
}

сейчас работает, спасибо.

1 голос
/ 18 апреля 2011

Ваша проблема в том, что вы вызываете 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.

...