这是我的设置。我有一个自定义 ListView
,带有一些花哨的 header ,它位于 ViewPager
中。我正在维护图像的内存缓存,这些图像已经下载并存储在本地,就像任何自尊的开发人员一样。
我遇到的问题是,每次我在 ListView
的 的
方法,使用缓存中的位图,它导致我的所有 View 都为 ImageView
上调用 setImageBitmap(Bitmap bm)
>getView()onMeasure()
。我查看了 Android ImageView
源代码并发现了这个:
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
的尺寸与其之前的尺寸不同时请求其布局 可绘制
。问题是我的 ImageView
静态设置为 60dp x 60dp,因此无论图像大小如何,它的大小都不会改变。
有没有一种方法可以绕过滚动时不断重新测量的布局? onMeasure
和 onLayout
调用在 View
树中向上传播,所以我的 ListView
和 ViewPager
还在列表滚动的中间进行测量,这显然会导致严重的性能问题(~100 毫秒 UI 跳转)。
性能很糟糕,我需要纠正它。谁有解决办法?
谢谢。
最佳答案
已经有一段时间了,但最近我遇到了类似的问题,我的 ListView 中的一行高度变化太大,导致调用了 listview.onmeasure。
如果您是针对 API-14 及更高版本构建的,则可以在 SDK 源代码中设置断点。这应该有助于弄清楚为什么高度会发生变化。
关于android - 每次设置 ImageView 位图时避免 onMeasure 和 onLayout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12522990/