android - 每次设置 ImageView 位图时避免 onMeasure 和 onLayout

标签 android android-layout listview view imageview

这是我的设置。我有一个自定义 ListView,带有一些花哨的 header ,它位于 ViewPager 中。我正在维护图像的内存缓存,这些图像已经下载并存储在本地,就像任何自尊的开发人员一样。

我遇到的问题是,每次我在 ListViewImageView 上调用 setImageBitmap(Bitmap bm) >getView() 方法,使用缓存中的位图,它导致我的所有 View 都为 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,因此无论图像大小如何,它的大小都不会改变。

有没有一种方法可以绕过滚动时不断重新测量的布局? onMeasureonLayout 调用在 View 树中向上传播,所以我的 ListViewViewPager 还在列表滚动的中间进行测量,这显然会导致严重的性能问题(~100 毫秒 UI 跳转)。

性能很糟糕,我需要纠正它。谁有解决办法?

谢谢。

最佳答案

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

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

关于android - 每次设置 ImageView 位图时避免 onMeasure 和 onLayout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12522990/

相关文章:

android服务、广播和 Activity

android - 使用全屏主题时,React Native 'Modal' 组件未覆盖 Android 上的整个屏幕

c# - 在 ListView 中禁用/更改 HoverOver 的颜色

Android 授予应用程序的可持久 uri 权限的最大数量限制为 128?

android - 如何用 c++_static 重建 OpenCv?

android - 如何使 Tab Widgets 中的文本占两行?

android - 获取运行时可用的 TextField 列表?

java - 在长时间运行的线程完成之前显示 Android 布局?

mysql - 使用 MySQL 的 DateTimePicker 显示日期

java - 我正在尝试使用 ListView 按钮从 cutomlistadapter 打开 Android Activity 。我尽了最大努力但没有结果?