2012-09-21 9 views
5

Bu benim kurulumumdur. ViewPager'un içinde bulunan bazı süslü başlıkları olan bir özel ListView var. Kendine saygılı bir geliştirici gibi yerel olarak indirilmiş ve depolanmış görüntülerin bir bellek önbelleğini koruyorum.Her zaman onLeft ve onLayout'tan kaçının ImageView Bitmap ayarı

yaşadığım sorun, bu onMeasure() benim bütün Görüntüleme neden oluyor önbellekten bir Bitmap kullanarak, benim ListView 'ın getView() yönteminde ImageView üzerinde setImageBitmap(Bitmap bm) dediğimiz her şey budur. Ben Android ImageView kaynak koduna göz baktı ve bu tespit ettik: Ben drawable önceki Drawable daha değişik, geldiğinde de hep (setImageBitmap tarafından çağrılan) setImageDrawable düzenini talep ettiğini görebilirsiniz

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(); 
    } 
} 

. Sorun şu ki, ImageView, 60dp x 60dp'ye statik ayarlanmış olduğundan, boyutu, görüntünün boyutuna bakılmaksızın değişmeyecek.

Kaydırırken sürekli olarak yeniden düzenlenmiş düzenlerin etrafında dolaşabileceğim bir yol var mı? onMeasure ve onLayout çağrıları View ağacına doğru ilerliyor, bu nedenle ListView ve ViewPager adreslerim de liste kaydırma işleminin ortasında ölçülüyor, bu da ciddi performans sorunlarına neden oluyor (~ 100 ms UI atlar).

Performans kötüyse ve düzeltmem gerekiyor. Herhangi bir çözümü olan var mı?

Teşekkürler.

+0

aklını nasıl paylaştığını paylaşıyor musunuz? – Dbl

cevap

2

Bir süredir var ama son zamanlarda benzer bir sorunum var, liste sıranın yüksekliğindeki bir satır çok fazla değişti ve listview.onmeasure çağrıldı.

API-14 ve üzeri sürümlere göre oluşturursanız, SDK kaynak kodunda kesme noktası ayarlayabilirsiniz. Yüksekliğin neden değiştiğini anlamaya yardımcı olmalı.