这是我的设置。我有一个自定义的ListView
,里面有一些奇特的头,它在ViewPager
里面。我正在维护一个图像的内存缓存,这些图像已经下载并存储在本地,就像任何自尊的开发人员一样。
我遇到的问题是,每次我在ListView
的getView()
方法中的ImageView
上使用缓存中的位图调用setImageBitmap(Bitmap bm)
时,都会导致我的所有视图变为onMeasure()
。我浏览了AndroidImageView
的源代码,发现了以下内容:
public void setImageDrawable(Drawable drawable) {
if (mDrawable != drawable) {
mResource = 0;
mUri = null;
int oldWidth = mDrawableWidth;
int oldHeight = mDrawableHeight;
updateDrawable(drawable);
if (oldWidth != mDrawableWidth || oldHeight != mDrawableHeight) {
requestLayout();
}
invalidate();
}
}
因此,我可以看到setImageDrawable
(由setImageBitmap
调用)在drawable
与之前的Drawable
具有不同尺寸时请求其布局。问题是,我的ImageView
被设置为静态的60dp x 60dp,所以无论图像大小如何,它的大小都不会改变。
有没有一种方法可以让我在滚动时避开不断重新测量的布局?onMeasure
和onLayout
调用正在向上传播View
树,因此我的ListView
和ViewPager
也在列表滚动的中间进行测量,这显然会导致严重的性能问题(约100ms UI跳转)。
性能太差了,我需要纠正。有人有什么解决方案吗?
谢谢。
这已经有一段时间了,但我最近遇到了类似的问题,我的listview中的一行高度变化太大,导致listview.onmeasure被调用。
如果您是针对API-14及更高版本构建的,则可以在SDK源代码中设置断点。这应该有助于弄清楚为什么身高会改变。