每次设置ImageView位图时都要避免使用onMeasure和onLayout

jmh*_*end 6 android listview view imageview android-layout

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

我遇到的问题是,每当我使用我的方法调用setImageBitmap(Bitmap bm)时,使用缓存中的Bitmap,就会导致我的所有视图都出现.我查看了Android 源代码,发现了这个:ImageViewListViewgetView()onMeasure()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();
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我可以看到setImageDrawable(它被称为setImageBitmap)只要drawable具有与之前不同的尺寸,就会请求它的布局Drawable.问题是我ImageView的静态设置为60dp x 60dp,因此无论图像大小如何,其大小都不会改变.

当我滚动时,有没有办法可以不断重新测量布局?在onMeasureonLayout调用传播自己的方式了View树,所以我ListViewViewPager也越来越在列表中滚动的中间,这显然是导致严重的性能问题(〜100ms的UI跳转)测量.

性能很差,我需要纠正它.有人有任何解决方案?

谢谢.

che*_*ang 2

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

如果您是针对 API-14 及更高版本构建的,则可以在 SDK 源代码中设置断点。这应该有助于找出高度改变的原因。