查看Holder模式,如何在适配器中处理Bitmap?

时间:2011-12-01 13:30:42

标签: android adapter

在API演示中,有一个有效列表适配器的示例,其中所有位图都在适配器构造函数中预加载:

// Icons bound to the rows.
mIcon1 = BitmapFactory.decodeResource(context.getResources(), R.drawable.icon48x48_1);
mIcon2 = BitmapFactory.decodeResource(context.getResources(), R.drawable.icon48x48_2);

如果适配器必须处理大量的位图,它仍然是一个好的做法,或者在getView中做类似的事情会更好:

holder.myImage.setImageDrawable(context.getResources().getDrawable(R.drawable.icon48x48_1));

请注意,在我的情况下,我可以使用10-15个可能的位图,但只会同时使用几个位图。我担心适配器使用的内存。

由于

2 个答案:

答案 0 :(得分:1)

如果图标真的是48x48像素,那么它们就不会那么大了,而且由于你有一套已知的图标,预加载它们可能就好了。如果出现以下情况,我不会使用这种方法:

  • 图像很大,或
  • 图像是从资源以外的地方加载的,或
  • 会有超过几十个图标大小的图片

您始终可以从DDMS转储堆并使用Eclipse MAT插件对其进行检查,以获取实际使用的堆空间量的透视图。但是,在Honeycomb或Ice Cream Sandwich上进行测试,因为您可以获得更好的跟踪位图堆消耗的结果。

答案 1 :(得分:0)

执行此操作的一种方法是等待列表停止,然后为可见的列表项设置图像。这样,您只需加载当前显示的图像(与预加载构造函数中的所有内容相比),并且不会使滚动感觉不稳定或缓慢。这是一项更多的工作,但它会使你的列表非常顺利,内存使用量最少。