列表视图与位图,outofmemoryerror

时间:2013-10-16 18:46:31

标签: android image listview memory bitmap

我搜索了很多,但我无法帮助自己。 是否有人可以说我的ListView如何修复OutOfMemoryError。 它只发生在我的ListView上添加了50多个位图之后。 我知道由于所有位图,设备内存已满,但有没有办法回收远离视口的位图?

这是我的ListView的适配器:

public class ImageAdapter extends ArrayAdapter<ExtendedBitmap>{
    private LinkedList<ExtendedBitmap> items;
    LayoutInflater mInflater = LayoutInflater.from(getContext());

    public ImageAdapter(Context context, int resource, LinkedList<ExtendedBitmap> items) {
        super(context, resource, items);
        this.items = items;
    }

    public void add(ExtendedBitmap bitmap)
    {
        items.add(bitmap);
        notifyDataSetChanged();
    }

    public void addFirst(ExtendedBitmap bitmap)
    {
        items.addFirst(bitmap);
        notifyDataSetChanged();
    }

    public ExtendedBitmap getBitmap(int position){
        return items.get(position);
    }

    @Override
    public View  getView(int position, View convertView, ViewGroup parent){
        ViewHolder holder; 

        if (convertView == null) { 
            convertView = mInflater.inflate(R.layout.extended_image, parent, false); ;
             holder = new ViewHolder();  
             holder.image = (ImageView) convertView.findViewById(R.id.image); 
             //holder.image.setOnTouchListener(new Touch());  
             convertView.setTag(holder); 
        }else { 
             holder = (ViewHolder) convertView.getTag(); 
        }

        holder.image.setImageBitmap(items.get(position).getBitmap());

        return convertView; 
    }
}

1 个答案:

答案 0 :(得分:1)

您应该首先了解ArrayAdapter的工作原理。

当您使用super(context, resource, items);调用super的构造函数时,它会获取您正在使用的集合(项目)的引用。您不需要在班级中保留对该集合的引用。

此指令将为您提供LinkedList中当前项目中当前项目中显示的项目:

ExtendedBitmap bitm = getItem(position);

您应该从Activity向集合中添加项目,然后从那里调用notifyDataSetChanged();。 ArrayAdapter将知道该怎么做。

其次,您不应该在ViewHolder中保留实际的位图。您应该存储位图的资源ID或URL,并且只获取getView()中的实际位图。

您可以使用LruCache来容纳位图。然后你需要逻辑来尝试从LruCache获取Bitmap或者根据需要重新创建它(如果需要的话)。

希望这会有所帮助。我从Big Nerd Ranch Android书中了解到这一点。