2012-09-21 4 views
5

これは私の設定です。私はListViewのカスタムヘッダを持っていて、それはViewPagerの中にあります。私は、ダウンロードされ、自尊心のある開発者のようにローカルに保存された画像のメモリキャッシュを維持しています。ImageViewのビットマップが設定されるたびにonMeasureとonLayoutを避ける

私がいる問題は、私はキャッシュからビットマップを使用して、私のListView年代getView()方法でImageViewsetImageBitmap(Bitmap bm)を呼び出すたびに、それはonMeasure()に私のすべてのビューを引き起こしているということです。私は、Android ImageViewソースコードを見て、これを見つけた:だから私はdrawableは、その前のDrawableよりも寸法が異なるた時はいつでも(setImageBitmapによって呼び出される)setImageDrawableがレイアウトを要求していることがわかります

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

。問題は、私のImageViewが60dp x 60dpに静的に設定されているため、画像のサイズに関係なくサイズが変更されないということです。

スクロールする際にレイアウトを常に再測定できる方法はありますか? onMeasureonLayoutコールがViewツリーの上に伝播しているので、リストスクロールの途中で私のListViewViewPagerも測定されているため、明らかに重大なパフォーマンス上の問題が発生しています(約100msのUIジャンプ)。

パフォーマンスはひどいので、修正する必要があります。誰にでも解決策がありますか?

ありがとうございました。

+0

マインド共有方法を教えてください。 – Dbl

答えて

2

これはしばらくしていますが、最近私のリストビューの高さの1つの行があまりにも多く変更されたため、listview.onmeasureが呼び出されました。

API-14以上でビルドする場合は、SDKのソースコードでブレークポイントを設定できます。高さが変わった理由を理解するのに役立つはずです。

関連する問題