使用ViewHolder滚动ListView时,图像被随机播放

时间:2011-04-12 13:21:37

标签: android listview scroll lazy-loading

当用户滚动ListView时,我的问题已关联。我环顾四周,看到了很多“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 个答案:

答案 0 :(得分:3)

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

现在正在工作,谢谢。

答案 1 :(得分:1)

您的问题是您在getView方法

中调用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();
}

上面的代码应该在getView方法之外完成。