【问题标题】:Images were Shuffled when scrolling a ListView with a ViewHolder使用 ViewHolder 滚动 ListView 时图像被洗牌
【发布时间】:2013-04-17 17:46:26
【问题描述】:

当用户滚动 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;
}

【问题讨论】:

  • 如果可能的话,发布一些源代码,也就是你实际上在做什么..

标签: android listview scroll lazy-loading


【解决方案1】:

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

现在可以使用了,谢谢。

【讨论】:

    【解决方案2】:

    您的问题是您在 getView 方法中收集 notifyDataSetChange()

    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 方法之外完成。

    【讨论】:

    • 我实现了本地缓存,并改变了下载图像的方式。我删除了 notifyDataSetChanged() 现在也正在下载图像并使用缓存。在列表视图中滚动时也使用了我的问题。谢谢。对不起,我的英语不清楚。
    • 你太棒了,我的朋友,我试图处理这几天,我通过缓存解决了这个问题,但在低级设备中,我再次遇到图片正在洗牌的原因是我正在检查缓存的图像通过AsyncTask 在 doInBackground 方法中。取出这段代码解决了我的问题。+1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    相关资源
    最近更新 更多