6

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

我遇到的问题是,每次我使用缓存中的位图调用我的方法setImageBitmap(Bitmap bm)时,都会导致我的所有视图都变为. 我查看了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();
    }
}

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

有没有办法让我在滚动时绕过不断重新测量的布局?和调用正在向上传播onMeasure,因此我的和也在列表滚动的中间进行测量,这显然会导致严重的性能问题(大约 100 毫秒的 UI 跳转)。onLayoutViewListViewViewPager

性能很糟糕,我需要纠正它。任何人有任何解决方案?

谢谢。

4

1 回答 1

2

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

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

于 2013-01-10T23:12:44.800 回答