每次设置ImageView位图时,请避免onMeasure和onLayout



这是我的设置。我有一个自定义的ListView,里面有一些奇特的头,它在ViewPager里面。我正在维护一个图像的内存缓存,这些图像已经下载并存储在本地,就像任何自尊的开发人员一样。

我遇到的问题是,每次我在ListViewgetView()方法中的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,所以无论图像大小如何,它的大小都不会改变。

有没有一种方法可以让我在滚动时避开不断重新测量的布局?onMeasureonLayout调用正在向上传播View树,因此我的ListViewViewPager也在列表滚动的中间进行测量,这显然会导致严重的性能问题(约100ms UI跳转)。

性能太差了,我需要纠正。有人有什么解决方案吗?

谢谢。

这已经有一段时间了,但我最近遇到了类似的问题,我的listview中的一行高度变化太大,导致listview.onmeasure被调用。

如果您是针对API-14及更高版本构建的,则可以在SDK源代码中设置断点。这应该有助于弄清楚为什么身高会改变。

最新更新