Listview with bitmaps,outofmemoryerror
我搜索了这么多,但我不能帮助自己。 有没有人可以说我的ListView如何解决OutOfMemoryError问题。 只有在我的ListView中添加了50多个位图后才会出现。 据我所知,由于所有的位图,设备内存已满,但是有没有办法回收远离视口的位图?Listview with bitmaps,outofmemoryerror
这里是我的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;
}
}
你应该先了解一个ArrayAdapter是如何工作的。
当您使用super(context, resource, items);
调用super的构造函数时,它会获得对您正在使用的集合(项目)的引用。你不需要在你的课堂中保留对该集合的引用。
,该指令将让你在LinkedList的当前项目将被显示在当前视图中的一个:
ExtendedBitmap bitm = getItem(position);
您应该从Activity
项目添加到集合,并从那里调用notifyDataSetChanged();
。 ArrayAdapter将知道该怎么做。其次,您不应该在ViewHolder中保留实际的位图。您应该存储位图的资源ID或URL,并且只在getView()中获取实际的位图。
您可以使用LruCache来放置位图。然后,您需要逻辑来尝试从LruCache获取位图,或根据需要重新创建它(如果需要)。
希望这会有所帮助。我从Big Nerd Ranch Android书中了解到了这一点。
我在我的Activity中使用了notifyDataSetChanged(),它运行良好。我会尝试下载每个位图并将View资源中的资源ID存储在ViewHolder中,但这是这种问题的常用解决方案吗? –
我也是新人。我不知道“通常的解决方案”是什么,但是最近编写了BNR书,作者正在为本书论坛积极回答问题。如果我要写一个类似的应用程序,我会认为他们的解决方案是一个起点,然后研究如何改进它以使我的实现更好。阅读侧栏上的其他Q/A将是一个好的开始。 –
看来,LruCache做到了。非常感谢您的建议! –
位图和内存不足问题在Android中猖獗。从侧边栏到右侧,这似乎回答您的问题:http://stackoverflow.com/questions/477572/strange-out-of-memory-issue-while-loading-an-image-to-a-bitmap-对象 –
他们谈得有点太笼统 –