当滚动我的列表视图项目图像改变

when scrolling my list view item images changed

public class Adapter extends BaseAdapter {
    private static ArrayList<ItemDetails> aList;

    private LayoutInflater l_Inflater;


    public Adapter(Context context, ArrayList<ItemDetails> results) {
        aList = results;
        l_Inflater = LayoutInflater.from(context);
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        final ViewHolder holder;
        if (convertView == null) {
            convertView = l_Inflater.inflate(R.layout.mylist1, null);
            holder = new ViewHolder();
            holder.name = (TextView) convertView.findViewById(R.id.name);
            holder.title = (TextView) convertView.findViewById(R.id.txt1);
            holder.ago = (TextView) convertView.findViewById(R.id.date);

            holder.member = (TextView) convertView.findViewById(R.id.member);
            holder.itemImage = (ImageView) convertView.findViewById(R.id.img_t);

            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.name.setText(aList.get(position).getName());
        holder.title.setText(aList.get(position).getTitle());
        holder.ago.setText(aList.get(position).getAgo());
        holder.member.setText(aList.get(position).getMember());
        String url = aList.get(position).getImg();
        Log.d("image_name", url);
        if (url.length() > 9) {
            Log.d("image_url", url);
            DownloadFileFromURL img = new DownloadFileFromURL(holder.itemImage, position);
            img.execute(url);
            if(img.pos == position) {
                holder.itemImage.setImageBitmap(img.bitmap);
            }
            aList.get(position).setChanged();
        }
        notifyDataSetChanged();
        return convertView;
    }

    public static class ViewHolder {
        TextView name;
        TextView title;
        TextView ago;
        TextView member;
        ImageView itemImage;
    }
}

asynck 任务class 成功后我更改图像

    protected void onPostExecute(String file_url) {
                if (imageViewReference != null) {
                    ImageView imageView = imageViewReference.get();
                            imageView.setImageBitmap(bitmap);
                   }
            }

        }

尽量不要将imageview放在viewholder里面。像这样

ImageView itemImage = (ImageView) convertView.findViewById(R.id.img_t);
itemImage.setImageBitmap(img.bitmap);

如果还不能解决问题,请使用 picasso 或 glide 来下载、缓存和显示图像。

ViewHolder 模式用于回收创建的视图(用于优化和防止膨胀大量视图),当您滚动列表视图时,实际上您需要下载多个不同的图像 url 并显示它们在同一个 ImageView 中(因为 holder.itemImage refrence 没有改变)。 所以只要你的 AsyntTask 完成它的工作,你的图像视图就会改变。

解决方案: 你可以为每一行放大你的视图,不要使用 ViewHolder 模式(不推荐),或者签署你的图像视图(使用 holder.itemImage。 setTag("yourUrl")) 和 url 并在将图像设置到 ImageView 之前在 AsyntTask 中检查它,只有标记的 url 等于 AsyntTask 下载的图像 url 改变了 ImageView .

但是为了便于使用和针对不同情况进行许多优化,我建议使用 Picasso 库在您的适配器中加载图像。