Избегайте onMeasure и onLayout каждый раз, когда установлен Bitmap ImageView

Это моя настройка. У меня есть собственный ListView с некоторыми причудливыми заголовками, который находится внутри ViewPager . Я поддерживаю кэш памяти изображений, которые были загружены и сохранены локально, как любой уважающий себя разработчик.

Проблема, с которой я сталкиваюсь, заключается в том, что каждый раз, когда я вызываю setImageBitmap(Bitmap bm) в ImageView в getView() моего ListView getView() , используя Bitmap из кеша, он вызывает все мои представления в 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 имеет разные размеры, чем предыдущий Drawable . Проблема в том, что мой ImageView статичен до 60dp x 60dp, поэтому его размер не изменится независимо от размера его изображения.

Есть ли способ, которым я могу обойти макеты, которые постоянно переоцениваются по мере прокрутки? onMeasure и onLayout распространяются по пути вверх по дереву View , поэтому мой ListView и ViewPager также измеряются в середине прокрутки списка, что, очевидно, вызывает серьезные проблемы с производительностью (скачки UI ~ 100 мс).

Производительность ужасная, и мне нужно ее исправить. У кого-нибудь есть какие-то решения?

Благодарю.

    Прошло некоторое время, но в последнее время у меня есть аналогичная проблема, одна строка в моей версии listview слишком сильно изменилась, вызвав вызов listview.onmeasure.

    Если вы создаете против API-14 и выше, вы можете установить точку останова в исходном коде SDK. Что должно помочь выяснить, почему высота изменяется.