我搜索了很多,但我无法帮助自己。 是否有人可以说我的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;
}
}
答案 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书中了解到这一点。